Checking project structure...
---------------------------A-01-1-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("s")
--(end of buffer or a NUL)
--accepting rule at line 66("t")
--(end of buffer or a NUL)
--accepting rule at line 66("r")
--(end of buffer or a NUL)
--accepting rule at line 66("i")
--(end of buffer or a NUL)
--accepting rule at line 66("n")
--(end of buffer or a NUL)
--accepting rule at line 66("g")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------A-02-2-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("s")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("t")
--(end of buffer or a NUL)
--accepting rule at line 66("r")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 47 95 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 1 10 28 47 95 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("i")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 47 95 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 1 10 28 47 95 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("n")
--(end of buffer or a NUL)
--accepting rule at line 66("g")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 47 95 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 1 10 28 47 95 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------A-03-3-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 73("\101")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 73("\102")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 47 95 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 1 10 28 47 95 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("C")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 47 95 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 1 10 28 47 95 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("D")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 47 95 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 1 10 28 47 95 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------A-04-4-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 73("\101")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 22("/*")
--(end of buffer or a NUL)
--accepting rule at line 25(" ")
--(end of buffer or a NUL)
--accepting rule at line 25(""")
--(end of buffer or a NUL)
--accepting rule at line 25("n")
--(end of buffer or a NUL)
--accepting rule at line 25("o")
--(end of buffer or a NUL)
--accepting rule at line 25("t")
--(end of buffer or a NUL)
--accepting rule at line 25(""")
--(end of buffer or a NUL)
--accepting rule at line 25(" ")
--(end of buffer or a NUL)
--accepting rule at line 25(""")
--(end of buffer or a NUL)
--accepting rule at line 25("a")
--(end of buffer or a NUL)
--accepting rule at line 25(""")
--(end of buffer or a NUL)
--accepting rule at line 25(" ")
--(end of buffer or a NUL)
--accepting rule at line 25(""")
--(end of buffer or a NUL)
--accepting rule at line 25("s")
--(end of buffer or a NUL)
--accepting rule at line 25("t")
--(end of buffer or a NUL)
--accepting rule at line 25("r")
--(end of buffer or a NUL)
--accepting rule at line 25("i")
--(end of buffer or a NUL)
--accepting rule at line 25("n")
--(end of buffer or a NUL)
--accepting rule at line 25("g")
--(end of buffer or a NUL)
--accepting rule at line 25(""")
--(end of buffer or a NUL)
--accepting rule at line 25(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 24("*/")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("A")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 47 95 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 1 10 28 47 95 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------A-05-5-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------A-06-6-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("o")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("a")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------A-07-7-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("X")
--(end of buffer or a NUL)
--accepting rule at line 66(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 73("\013")
--(end of buffer or a NUL)
--accepting rule at line 66(" ")
--(end of buffer or a NUL)
--accepting rule at line 66("Y")
--(end of buffer or a NUL)
--accepting rule at line 66(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 73("\13")
--accepting rule at line 66(" ")
--(end of buffer or a NUL)
--accepting rule at line 66("Z")
--(end of buffer or a NUL)
--accepting rule at line 66(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 68("\n")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/A-07-7-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_A-07-7-N-ok.out Thu May 23 20:36:01 2024
----- ZONE 1 ----
*** 1 ****
--- 1,2 ----
X Y Z
+
TEST PASSED!
---------------------------A-08-8-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("x")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 68("\n")
--(end of buffer or a NUL)
--accepting rule at line 66("Y")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 67("\t")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 73("\172")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 68("\n")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/A-08-8-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_A-08-8-N-ok.out Thu May 23 20:36:01 2024
----- ZONE 1 ----
*** 1 ****
! xYz
--- 1,3 ----
! x
! Y z
!
TEST PASSED!
---------------------------B-01-9-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 28 47 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 67 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 28 47 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 28 47 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 28 47 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-02-10-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 28 47 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 67 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 28 47 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82 67 118 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("*")
Next token is token '*' ()
Shifting token '*' ()
Entering state 69
Stack now 0 1 10 28 47 82 67 118 82 69
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 67 118 82 69 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 120
Stack now 0 1 10 28 47 82 67 118 82 69 120
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 67 118 82 69 120 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 165
Stack now 0 1 10 28 47 82 67 118 82 69 120 165
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 197
Stack now 0 1 10 28 47 82 67 118 82 69 120 165 197
Reducing stack by rule 60 (line 153):
$1 = token '(' ()
$2 = token '*' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 28 47 82 67 118 162
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 28 47 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-03-11-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 1 10 28 47 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 68 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 1 10 28 47 82 68 119
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82 68 119 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("*")
Next token is token '*' ()
Shifting token '*' ()
Entering state 69
Stack now 0 1 10 28 47 82 68 119 82 69
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 68 119 82 69 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 120
Stack now 0 1 10 28 47 82 68 119 82 69 120
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 68 119 82 69 120 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 165
Stack now 0 1 10 28 47 82 68 119 82 69 120 165
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 197
Stack now 0 1 10 28 47 82 68 119 82 69 120 165 197
Reducing stack by rule 60 (line 153):
$1 = token '(' ()
$2 = token '*' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 164
Stack now 0 1 10 28 47 82 68 119 164
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 196
Stack now 0 1 10 28 47 82 68 119 164 196
Reducing stack by rule 59 (line 152):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-04-12-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 1 10 28 47 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 68 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 1 10 28 47 82 68 119
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82 68 119 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 28 47 82 68 119 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 68 119 82 67 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 28 47 82 68 119 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("5")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 68 119 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 28 47 82 68 119 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 28 47 82 68 119 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 164
Stack now 0 1 10 28 47 82 68 119 164
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 196
Stack now 0 1 10 28 47 82 68 119 164 196
Reducing stack by rule 59 (line 152):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-05-13-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 1 10 28 47 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("100")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 68 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 1 10 28 47 82 68 119
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("100")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 68 119 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 164
Stack now 0 1 10 28 47 82 68 119 164
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 196
Stack now 0 1 10 28 47 82 68 119 164 196
Reducing stack by rule 59 (line 152):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-06-14-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 108("/")
Next token is token '/' ()
Shifting token '/' ()
Entering state 70
Stack now 0 1 10 28 47 82 70
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("100")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 70 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 121
Stack now 0 1 10 28 47 82 70 121
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("100")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 70 121 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 166
Stack now 0 1 10 28 47 82 70 121 166
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 198
Stack now 0 1 10 28 47 82 70 121 166 198
Reducing stack by rule 61 (line 154):
$1 = token '(' ()
$2 = token '/' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-07-15-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("%")
Next token is token '%' ()
Shifting token '%' ()
Entering state 71
Stack now 0 1 10 28 47 82 71
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("150")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 71 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 122
Stack now 0 1 10 28 47 82 71 122
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("100")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 71 122 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 167
Stack now 0 1 10 28 47 82 71 122 167
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 199
Stack now 0 1 10 28 47 82 71 122 167 199
Reducing stack by rule 62 (line 155):
$1 = token '(' ()
$2 = token '%' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-08-16-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 108("<")
Next token is token '<' ()
Shifting token '<' ()
Entering state 63
Stack now 0 1 10 28 47 82 63
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 63 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 114
Stack now 0 1 10 28 47 82 63 114
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 63 114 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 157
Stack now 0 1 10 28 47 82 63 114 157
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 192
Stack now 0 1 10 28 47 82 63 114 157 192
Reducing stack by rule 63 (line 156):
$1 = token '(' ()
$2 = token '<' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-09-17-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 108(">")
Next token is token '>' ()
Shifting token '>' ()
Entering state 62
Stack now 0 1 10 28 47 82 62
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 62 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 113
Stack now 0 1 10 28 47 82 62 113
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 62 113 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 156
Stack now 0 1 10 28 47 82 62 113 156
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 191
Stack now 0 1 10 28 47 82 62 113 156 191
Reducing stack by rule 64 (line 157):
$1 = token '(' ()
$2 = token '>' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-10-18-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("~")
Next token is token '~' ()
Shifting token '~' ()
Entering state 64
Stack now 0 1 10 28 47 82 64
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82 64 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 108(">")
Next token is token '>' ()
Shifting token '>' ()
Entering state 62
Stack now 0 1 10 28 47 82 64 82 62
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 64 82 62 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 113
Stack now 0 1 10 28 47 82 64 82 62 113
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 64 82 62 113 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 156
Stack now 0 1 10 28 47 82 64 82 62 113 156
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 191
Stack now 0 1 10 28 47 82 64 82 62 113 156 191
Reducing stack by rule 64 (line 157):
$1 = token '(' ()
$2 = token '>' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 115
Stack now 0 1 10 28 47 82 64 115
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 158
Stack now 0 1 10 28 47 82 64 115 158
Reducing stack by rule 74 (line 167):
$1 = token '(' ()
$2 = token '~' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-11-19-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("~")
Next token is token '~' ()
Shifting token '~' ()
Entering state 64
Stack now 0 1 10 28 47 82 64
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82 64 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 108("<")
Next token is token '<' ()
Shifting token '<' ()
Entering state 63
Stack now 0 1 10 28 47 82 64 82 63
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 64 82 63 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 114
Stack now 0 1 10 28 47 82 64 82 63 114
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 64 82 63 114 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 157
Stack now 0 1 10 28 47 82 64 82 63 114 157
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 192
Stack now 0 1 10 28 47 82 64 82 63 114 157 192
Reducing stack by rule 63 (line 156):
$1 = token '(' ()
$2 = token '<' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 115
Stack now 0 1 10 28 47 82 64 115
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 158
Stack now 0 1 10 28 47 82 64 115 158
Reducing stack by rule 74 (line 167):
$1 = token '(' ()
$2 = token '~' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-12-20-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 1 10 28 47 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 60 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 1 10 28 47 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 1 10 28 47 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 1 10 28 47 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-13-21-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("~")
Next token is token '~' ()
Shifting token '~' ()
Entering state 64
Stack now 0 1 10 28 47 82 64
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82 64 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 1 10 28 47 82 64 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 64 82 60 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 1 10 28 47 82 64 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 64 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 1 10 28 47 82 64 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 1 10 28 47 82 64 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 115
Stack now 0 1 10 28 47 82 64 115
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 158
Stack now 0 1 10 28 47 82 64 115 158
Reducing stack by rule 74 (line 167):
$1 = token '(' ()
$2 = token '~' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-14-22-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 32("&&")
Next token is token tAND ()
Shifting token tAND ()
Entering state 65
Stack now 0 1 10 28 47 82 65
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82 65 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 1 10 28 47 82 65 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 65 82 60 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 1 10 28 47 82 65 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 65 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 1 10 28 47 82 65 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 1 10 28 47 82 65 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 116
Stack now 0 1 10 28 47 82 65 116
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82 65 116 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("~")
Next token is token '~' ()
Shifting token '~' ()
Entering state 64
Stack now 0 1 10 28 47 82 65 116 82 64
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82 65 116 82 64 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 1 10 28 47 82 65 116 82 64 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 65 116 82 64 82 60 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 1 10 28 47 82 65 116 82 64 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 65 116 82 64 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 1 10 28 47 82 65 116 82 64 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 1 10 28 47 82 65 116 82 64 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 115
Stack now 0 1 10 28 47 82 65 116 82 64 115
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 158
Stack now 0 1 10 28 47 82 65 116 82 64 115 158
Reducing stack by rule 74 (line 167):
$1 = token '(' ()
$2 = token '~' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 159
Stack now 0 1 10 28 47 82 65 116 159
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 193
Stack now 0 1 10 28 47 82 65 116 159 193
Reducing stack by rule 70 (line 163):
$1 = token '(' ()
$2 = token tAND ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-15-23-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 33("||")
Next token is token tOR ()
Shifting token tOR ()
Entering state 66
Stack now 0 1 10 28 47 82 66
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82 66 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 1 10 28 47 82 66 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 66 82 60 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 1 10 28 47 82 66 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 66 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 1 10 28 47 82 66 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 1 10 28 47 82 66 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 117
Stack now 0 1 10 28 47 82 66 117
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82 66 117 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 1 10 28 47 82 66 117 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 66 117 82 60 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 1 10 28 47 82 66 117 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 66 117 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 1 10 28 47 82 66 117 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 1 10 28 47 82 66 117 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 160
Stack now 0 1 10 28 47 82 66 117 160
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 194
Stack now 0 1 10 28 47 82 66 117 160 194
Reducing stack by rule 69 (line 162):
$1 = token '(' ()
$2 = token tOR ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-16-24-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 28 47 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 67 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 28 47 82 67 118
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 161
Stack now 0 1 10 28 47 82 67 118 161
Reducing stack by rule 57 (line 150):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-17-25-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 1 10 28 47 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82 68 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 1 10 28 47 82 68 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 68 82 68 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 1 10 28 47 82 68 82 68 119
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 163
Stack now 0 1 10 28 47 82 68 82 68 119 163
Reducing stack by rule 56 (line 149):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 1 10 28 47 82 68 119
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 163
Stack now 0 1 10 28 47 82 68 119 163
Reducing stack by rule 56 (line 149):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-20-26-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 45 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("K")
--(end of buffer or a NUL)
--accepting rule at line 66("O")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 139 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("O")
--(end of buffer or a NUL)
--accepting rule at line 66("K")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 139 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 139 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 139 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 139 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 28 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 28 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-21-27-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 45 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("K")
--(end of buffer or a NUL)
--accepting rule at line 66("O")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 139 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("O")
--(end of buffer or a NUL)
--accepting rule at line 66("K")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 139 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 139 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 139 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 139 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 28 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 28 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-22-28-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 45 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("K")
--(end of buffer or a NUL)
--accepting rule at line 66("O")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 139 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("O")
--(end of buffer or a NUL)
--accepting rule at line 66("K")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 139 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 139 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 139 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 139 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 28 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 28 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-23-29-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 45 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("K")
--(end of buffer or a NUL)
--accepting rule at line 66("O")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 139 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("O")
--(end of buffer or a NUL)
--accepting rule at line 66("K")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 139 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 139 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 139 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 139 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 28 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 28 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-24-30-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 90("0xF")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------B-25-31-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 90("0x2f")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 90("0x2f")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 47 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 31 79 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/B-25-31-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_B-25-31-N-ok.out Thu May 23 20:36:02 2024
----- ZONE 1 ----
*** 1 ****
! 4747
--- 1,2 ----
! 47
! 47
TEST PASSED!
---------------------------C-01-32-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 10 28 47 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 68 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 68 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 10 28 47 82 68 119
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 68 119 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 68 119 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 164
Stack now 0 4 1 10 28 47 82 68 119 164
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 196
Stack now 0 4 1 10 28 47 82 68 119 164 196
Reducing stack by rule 59 (line 152):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
3: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/C-01-32-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_C-01-32-N-ok.out Thu May 23 20:36:02 2024
----- ZONE 1 ----
*** 1 ****
- 0
--- 0 ----
output differs from expected
---------------------------C-02-33-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("4")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
3: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/C-02-33-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_C-02-33-N-ok.out Thu May 23 20:36:02 2024
----- ZONE 1 ----
*** 1 ****
- 4
--- 0 ----
output differs from expected
---------------------------C-03-34-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 45("string")
Next token is token tSTRING_TYPE ()
Shifting token tSTRING_TYPE ()
Entering state 8
Stack now 0 1 8
Reducing stack by rule 25 (line 104):
$1 = token tSTRING_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("o")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("a")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 18 42 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
3: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/C-03-34-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_C-03-34-N-ok.out Thu May 23 20:36:02 2024
----- ZONE 1 ----
*** 1 ****
- ola
--- 0 ----
output differs from expected
---------------------------C-04-35-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("4")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 28 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------C-05-36-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("4")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 28 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------C-06-37-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 28 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 31 79 47 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 67 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 31 79 47 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 67 118 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("*")
Next token is token '*' ()
Shifting token '*' ()
Entering state 69
Stack now 0 4 1 10 31 79 47 82 67 118 82 69
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 67 118 82 69 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 82 67 118 82 69 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 120
Stack now 0 4 1 10 31 79 47 82 67 118 82 69 120
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 67 118 82 69 120 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 165
Stack now 0 4 1 10 31 79 47 82 67 118 82 69 120 165
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 197
Stack now 0 4 1 10 31 79 47 82 67 118 82 69 120 165 197
Reducing stack by rule 60 (line 153):
$1 = token '(' ()
$2 = token '*' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 31 79 47 82 67 118 162
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 31 79 47 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------C-07-38-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 10 28 56 107 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 56 107 82 68 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 10 28 56 107 82 68 119
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 163
Stack now 0 4 1 10 28 56 107 82 68 119 163
Reducing stack by rule 56 (line 149):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 31 79 47 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 67 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 31 79 47 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 67 118 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("*")
Next token is token '*' ()
Shifting token '*' ()
Entering state 69
Stack now 0 4 1 10 31 79 47 82 67 118 82 69
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 67 118 82 69 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 10 31 79 47 82 67 118 82 69 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 67 118 82 69 82 68 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 82 67 118 82 69 82 68 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 10 31 79 47 82 67 118 82 69 82 68 119
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 163
Stack now 0 4 1 10 31 79 47 82 67 118 82 69 82 68 119 163
Reducing stack by rule 56 (line 149):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 120
Stack now 0 4 1 10 31 79 47 82 67 118 82 69 120
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 67 118 82 69 120 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 165
Stack now 0 4 1 10 31 79 47 82 67 118 82 69 120 165
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 197
Stack now 0 4 1 10 31 79 47 82 67 118 82 69 120 165 197
Reducing stack by rule 60 (line 153):
$1 = token '(' ()
$2 = token '*' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 31 79 47 82 67 118 162
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 31 79 47 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------C-08-39-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 108("<")
Next token is token '<' ()
Shifting token '<' ()
Entering state 63
Stack now 0 4 1 10 28 47 82 63
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 63 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 63 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 114
Stack now 0 4 1 10 28 47 82 63 114
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 63 114 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 63 114 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 157
Stack now 0 4 1 10 28 47 82 63 114 157
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 192
Stack now 0 4 1 10 28 47 82 63 114 157 192
Reducing stack by rule 63 (line 156):
$1 = token '(' ()
$2 = token '<' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
4: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/C-08-39-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_C-08-39-N-ok.out Thu May 23 20:36:03 2024
----- ZONE 1 ----
*** 1 ****
- 0
--- 0 ----
output differs from expected
---------------------------C-09-40-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 108(">")
Next token is token '>' ()
Shifting token '>' ()
Entering state 62
Stack now 0 4 1 10 28 47 82 62
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 62 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 62 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 113
Stack now 0 4 1 10 28 47 82 62 113
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 62 113 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 62 113 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 156
Stack now 0 4 1 10 28 47 82 62 113 156
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 191
Stack now 0 4 1 10 28 47 82 62 113 156 191
Reducing stack by rule 64 (line 157):
$1 = token '(' ()
$2 = token '>' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
4: undeclared variable 'y'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/C-09-40-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_C-09-40-N-ok.out Thu May 23 20:36:03 2024
----- ZONE 1 ----
*** 1 ****
- 0
--- 0 ----
output differs from expected
---------------------------C-10-41-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 4 1 10 28 47 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 4 1 10 28 47 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 59 110 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 59 110 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 4 1 10 28 47 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 4 1 10 28 47 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
4: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/C-10-41-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_C-10-41-N-ok.out Thu May 23 20:36:03 2024
----- ZONE 1 ----
*** 1 ****
- 0
--- 0 ----
output differs from expected
---------------------------C-11-42-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 28(">=")
Next token is token tGE ()
Shifting token tGE ()
Entering state 58
Stack now 0 4 1 10 28 47 82 58
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 58 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 58 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 109
Stack now 0 4 1 10 28 47 82 58 109
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 58 109 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 58 109 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 152
Stack now 0 4 1 10 28 47 82 58 109 152
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 187
Stack now 0 4 1 10 28 47 82 58 109 152 187
Reducing stack by rule 65 (line 158):
$1 = token '(' ()
$2 = token tGE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
4: undeclared variable 'y'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/C-11-42-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_C-11-42-N-ok.out Thu May 23 20:36:03 2024
----- ZONE 1 ----
*** 1 ****
- 0
--- 0 ----
output differs from expected
---------------------------C-12-43-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 4 1 10 28 47 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 60 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 60 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 4 1 10 28 47 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 60 111 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 60 111 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 4 1 10 28 47 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 4 1 10 28 47 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
4: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/C-12-43-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_C-12-43-N-ok.out Thu May 23 20:36:03 2024
----- ZONE 1 ----
*** 1 ****
- 0
--- 0 ----
output differs from expected
---------------------------C-13-44-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 31("!=")
Next token is token tNE ()
Shifting token tNE ()
Entering state 61
Stack now 0 4 1 10 28 47 82 61
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 61 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 61 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 112
Stack now 0 4 1 10 28 47 82 61 112
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 61 112 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 61 112 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 155
Stack now 0 4 1 10 28 47 82 61 112 155
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 190
Stack now 0 4 1 10 28 47 82 61 112 155 190
Reducing stack by rule 67 (line 160):
$1 = token '(' ()
$2 = token tNE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
4: undeclared variable 'y'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/C-13-44-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_C-13-44-N-ok.out Thu May 23 20:36:03 2024
----- ZONE 1 ----
*** 1 ****
- 0
--- 0 ----
output differs from expected
---------------------------C-14-45-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 32("&&")
Next token is token tAND ()
Shifting token tAND ()
Entering state 65
Stack now 0 4 1 10 28 47 82 65
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82 65 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 4 1 10 28 47 82 65 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 65 82 60 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 65 82 60 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 4 1 10 28 47 82 65 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 65 82 60 111 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 65 82 60 111 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 4 1 10 28 47 82 65 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 4 1 10 28 47 82 65 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 116
Stack now 0 4 1 10 28 47 82 65 116
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82 65 116 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 31("!=")
Next token is token tNE ()
Shifting token tNE ()
Entering state 61
Stack now 0 4 1 10 28 47 82 65 116 82 61
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 65 116 82 61 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 65 116 82 61 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 112
Stack now 0 4 1 10 28 47 82 65 116 82 61 112
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 65 116 82 61 112 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 65 116 82 61 112 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 155
Stack now 0 4 1 10 28 47 82 65 116 82 61 112 155
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 190
Stack now 0 4 1 10 28 47 82 65 116 82 61 112 155 190
Reducing stack by rule 67 (line 160):
$1 = token '(' ()
$2 = token tNE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 159
Stack now 0 4 1 10 28 47 82 65 116 159
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 193
Stack now 0 4 1 10 28 47 82 65 116 159 193
Reducing stack by rule 70 (line 163):
$1 = token '(' ()
$2 = token tAND ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------C-15-46-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 33("||")
Next token is token tOR ()
Shifting token tOR ()
Entering state 66
Stack now 0 4 1 10 28 47 82 66
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82 66 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 4 1 10 28 47 82 66 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 66 82 60 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 66 82 60 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 4 1 10 28 47 82 66 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 66 82 60 111 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 66 82 60 111 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 4 1 10 28 47 82 66 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 4 1 10 28 47 82 66 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 117
Stack now 0 4 1 10 28 47 82 66 117
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82 66 117 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 4 1 10 28 47 82 66 117 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 66 117 82 60 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 66 117 82 60 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 4 1 10 28 47 82 66 117 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 66 117 82 60 111 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 66 117 82 60 111 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 4 1 10 28 47 82 66 117 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 4 1 10 28 47 82 66 117 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 160
Stack now 0 4 1 10 28 47 82 66 117 160
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 194
Stack now 0 4 1 10 28 47 82 66 117 160 194
Reducing stack by rule 69 (line 162):
$1 = token '(' ()
$2 = token tOR ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------C-16-47-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 4 1 10 28 47 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82 60 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("~")
Next token is token '~' ()
Shifting token '~' ()
Entering state 64
Stack now 0 4 1 10 28 47 82 60 82 64
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82 60 82 64 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 4 1 10 28 47 82 60 82 64 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 60 82 64 82 60 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 60 82 64 82 60 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 4 1 10 28 47 82 60 82 64 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 60 82 64 82 60 111 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 60 82 64 82 60 111 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 4 1 10 28 47 82 60 82 64 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 4 1 10 28 47 82 60 82 64 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 115
Stack now 0 4 1 10 28 47 82 60 82 64 115
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 158
Stack now 0 4 1 10 28 47 82 60 82 64 115 158
Reducing stack by rule 74 (line 167):
$1 = token '(' ()
$2 = token '~' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 4 1 10 28 47 82 60 111
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 60 111 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 60 111 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 4 1 10 28 47 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 4 1 10 28 47 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/C-16-47-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_C-16-47-N-ok.out Thu May 23 20:36:03 2024
----- ZONE 1 ----
*** 1 ****
- 0
--- 0 ----
output differs from expected
---------------------------C-19-48-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
3: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/C-19-48-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_C-19-48-N-ok.out Thu May 23 20:36:03 2024
----- ZONE 1 ----
*** 1 ****
- 10
--- 0 ----
output differs from expected
---------------------------C-20-49-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 45("string")
Next token is token tSTRING_TYPE ()
Shifting token tSTRING_TYPE ()
Entering state 8
Stack now 0 1 8
Reducing stack by rule 25 (line 104):
$1 = token tSTRING_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("o")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("e")
--(end of buffer or a NUL)
--accepting rule at line 66("2")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 18 42 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
3: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/C-20-49-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_C-20-49-N-ok.out Thu May 23 20:36:04 2024
----- ZONE 1 ----
*** 1 ****
- ole2
--- 0 ----
output differs from expected
---------------------------D-01-50-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 45 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("K")
--(end of buffer or a NUL)
--accepting rule at line 66("O")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 28 45 92 139 79 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 45 92 139 79 45 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 28 45 92 139 79 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 139 79 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("e")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("i")
--(end of buffer or a NUL)
--accepting rule at line 66("f")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 139 79 45 92 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 139 79 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 139 79 45 92 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 139 79 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 28 45 92 139 79 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("O")
--(end of buffer or a NUL)
--accepting rule at line 66("K")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 28 45 92 139 79 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 28 45 92 139 79 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 28 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 28 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------D-02-51-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 45 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("K")
--(end of buffer or a NUL)
--accepting rule at line 66("O")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 28 45 92 139 79 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 45 92 139 79 45 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 28 45 92 139 79 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 139 79 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("e")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("i")
--(end of buffer or a NUL)
--accepting rule at line 66("f")
--(end of buffer or a NUL)
--accepting rule at line 66("1")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 139 79 45 92 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 139 79 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 139 79 45 92 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 139 79 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 28 45 92 139 79 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("e")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("i")
--(end of buffer or a NUL)
--accepting rule at line 66("f")
--(end of buffer or a NUL)
--accepting rule at line 66("2")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("e")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("i")
--(end of buffer or a NUL)
--accepting rule at line 66("f")
--(end of buffer or a NUL)
--accepting rule at line 66("3")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("e")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("i")
--(end of buffer or a NUL)
--accepting rule at line 66("f")
--(end of buffer or a NUL)
--accepting rule at line 66("4")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("O")
--(end of buffer or a NUL)
--accepting rule at line 66("K")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 28 45 92 139 79 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 28 45 92 139 79 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 28 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 28 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------D-03-52-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 45 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("K")
--(end of buffer or a NUL)
--accepting rule at line 66("O")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 28 45 92 139 79 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 45 92 139 79 45 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 28 45 92 139 79 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 139 79 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("e")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("i")
--(end of buffer or a NUL)
--accepting rule at line 66("f")
--(end of buffer or a NUL)
--accepting rule at line 66("1")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 139 79 45 92 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 139 79 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 139 79 45 92 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 139 79 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 28 45 92 139 79 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("e")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("i")
--(end of buffer or a NUL)
--accepting rule at line 66("f")
--(end of buffer or a NUL)
--accepting rule at line 66("2")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("e")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("i")
--(end of buffer or a NUL)
--accepting rule at line 66("f")
--(end of buffer or a NUL)
--accepting rule at line 66("3")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("e")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("i")
--(end of buffer or a NUL)
--accepting rule at line 66("f")
--(end of buffer or a NUL)
--accepting rule at line 66("4")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("O")
--(end of buffer or a NUL)
--accepting rule at line 66("K")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 79 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 28 45 92 139 79 45 92 139 79 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 28 45 92 139 79 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 28 45 92 139 79 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 28 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 28 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------E-01-53-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 28 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 4 1 10 31 79 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 4 1 10 31 79 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 4 1 10 31 79 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 4 1 10 31 79 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 4 1 10 31 79 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 4 1 10 31 79 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 4 1 10 31 79 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 31 79 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 44 91 79 52 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 31 79 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 31 79 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 79 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 4 1 10 31 79 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 4 1 10 31 79 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 4 1 10 31 79 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 4 1 10 31 79 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/E-01-53-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_E-01-53-N-ok.out Thu May 23 20:36:04 2024
----- ZONE 1 ----
*** 1 ****
! 123
--- 1,3 ----
! 1
! 2
! 3
TEST PASSED!
---------------------------E-02-54-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 28 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 4 1 10 31 79 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 28(">=")
Next token is token tGE ()
Shifting token tGE ()
Entering state 58
Stack now 0 4 1 10 31 79 44 82 58
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 82 58 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 44 82 58 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 109
Stack now 0 4 1 10 31 79 44 82 58 109
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 44 82 58 109 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 10 31 79 44 82 58 109 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 44 82 58 109 82 68 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 10 31 79 44 82 58 109 82 68 119
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 163
Stack now 0 4 1 10 31 79 44 82 58 109 82 68 119 163
Reducing stack by rule 56 (line 149):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 152
Stack now 0 4 1 10 31 79 44 82 58 109 152
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 187
Stack now 0 4 1 10 31 79 44 82 58 109 152 187
Reducing stack by rule 65 (line 158):
$1 = token '(' ()
$2 = token tGE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 4 1 10 31 79 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 4 1 10 31 79 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 31 79 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 44 91 79 52 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 31 79 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 68 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 68 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 68 119
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 68 119 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 164
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 68 119 164
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 196
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 68 119 164 196
Reducing stack by rule 59 (line 152):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 31 79 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 79 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 4 1 10 31 79 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 4 1 10 31 79 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 4 1 10 31 79 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 4 1 10 31 79 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/E-02-54-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_E-02-54-N-ok.out Thu May 23 20:36:04 2024
----- ZONE 1 ----
*** 1 ****
! 10-1-2-3
--- 1,5 ----
! 1
! 0
! -1
! -2
! -3
TEST PASSED!
---------------------------E-03-55-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("9")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 47 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 31 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 4 1 10 31 79 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 108("<")
Next token is token '<' ()
Shifting token '<' ()
Entering state 63
Stack now 0 4 1 10 31 79 44 82 63
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 82 63 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 44 82 63 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 114
Stack now 0 4 1 10 31 79 44 82 63 114
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 44 82 63 114 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 10 31 79 44 82 63 114 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 44 82 63 114 82 68 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 10 31 79 44 82 63 114 82 68 119
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 163
Stack now 0 4 1 10 31 79 44 82 63 114 82 68 119 163
Reducing stack by rule 56 (line 149):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 157
Stack now 0 4 1 10 31 79 44 82 63 114 157
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 192
Stack now 0 4 1 10 31 79 44 82 63 114 157 192
Reducing stack by rule 63 (line 156):
$1 = token '(' ()
$2 = token '<' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 4 1 10 31 79 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 4 1 10 31 79 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 31 79 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 44 91 79 52 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 31 79 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 31 79 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 79 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 4 1 10 31 79 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 4 1 10 31 79 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 4 1 10 31 79 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 4 1 10 31 79 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------E-04-56-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 28 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 4 1 10 31 79 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 4 1 10 31 79 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 4 1 10 31 79 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("5")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 4 1 10 31 79 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 4 1 10 31 79 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 4 1 10 31 79 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 4 1 10 31 79 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 31 79 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 44 91 79 52 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 31 79 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 31 79 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 79 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 4 1 10 31 79 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 4 1 10 31 79 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 4 1 10 31 79 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 4 1 10 31 79 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/E-04-56-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_E-04-56-N-ok.out Thu May 23 20:36:04 2024
----- ZONE 1 ----
*** 1 ****
! 135
--- 1,3 ----
! 1
! 3
! 5
TEST PASSED!
---------------------------E-05-57-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 4 1 10 28 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 4 1 10 28 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 4 1 10 28 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 4 1 10 28 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 4 1 10 28 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 4 1 10 28 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 28 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 4 1 10 28 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 44 91 79 52 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 44 91 79 52 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 44 91 79 52 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 44 91 79 52 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 44 91 79 52 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 44 91 79 52 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 28 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 28 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 28 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 28 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 28 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 4 1 10 28 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 4 1 10 28 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 4 1 10 28 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 4 1 10 28 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
3: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/E-05-57-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_E-05-57-N-ok.out Thu May 23 20:36:04 2024
----- ZONE 1 ----
*** 1 ****
- 123
--- 0 ----
output differs from expected
---------------------------E-06-58-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 4 1 10 28 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 28(">=")
Next token is token tGE ()
Shifting token tGE ()
Entering state 58
Stack now 0 4 1 10 28 44 82 58
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 44 82 58 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 44 82 58 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 109
Stack now 0 4 1 10 28 44 82 58 109
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 44 82 58 109 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 10 28 44 82 58 109 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 44 82 58 109 82 68 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 10 28 44 82 58 109 82 68 119
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 163
Stack now 0 4 1 10 28 44 82 58 109 82 68 119 163
Reducing stack by rule 56 (line 149):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 152
Stack now 0 4 1 10 28 44 82 58 109 152
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 187
Stack now 0 4 1 10 28 44 82 58 109 152 187
Reducing stack by rule 65 (line 158):
$1 = token '(' ()
$2 = token tGE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 4 1 10 28 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 28 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 4 1 10 28 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 44 91 79 52 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 44 91 79 52 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 44 91 79 52 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 44 91 79 52 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 44 91 79 52 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 44 91 79 52 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 28 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 28 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 28 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 68 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 68 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 68 119
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 68 119 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 164
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 68 119 164
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 196
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 68 119 164 196
Reducing stack by rule 59 (line 152):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 28 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 28 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 4 1 10 28 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 4 1 10 28 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 4 1 10 28 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 4 1 10 28 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
3: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/E-06-58-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_E-06-58-N-ok.out Thu May 23 20:36:04 2024
----- ZONE 1 ----
*** 1 ****
- 10-1-2-3
--- 0 ----
output differs from expected
---------------------------E-07-59-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("9")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 47 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 4 1 10 31 79 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 4 1 10 31 79 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 4 1 10 31 79 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 44 82 59 110 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 10 31 79 44 82 59 110 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 44 82 59 110 82 68 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 10 31 79 44 82 59 110 82 68 119
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 163
Stack now 0 4 1 10 31 79 44 82 59 110 82 68 119 163
Reducing stack by rule 56 (line 149):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 4 1 10 31 79 44 82 59 110 153
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 4 1 10 31 79 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 4 1 10 31 79 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 4 1 10 31 79 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 31 79 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 44 91 79 52 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 44 91 79 52 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 31 79 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 31 79 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 31 79 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 79 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 4 1 10 31 79 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 4 1 10 31 79 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 4 1 10 31 79 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 4 1 10 31 79 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
4: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: TEST PASSED!
---------------------------E-08-60-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 4 1 10 28 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 4 1 10 28 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 4 1 10 28 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("5")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 4 1 10 28 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 4 1 10 28 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 4 1 10 28 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 28 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 4 1 10 28 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 44 91 79 52 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 44 91 79 52 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 44 91 79 52 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 44 91 79 52 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 44 91 79 52 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 44 91 79 52 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 28 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 28 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 28 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 28 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 28 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 28 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 4 1 10 28 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 4 1 10 28 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 4 1 10 28 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 4 1 10 28 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
3: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/E-08-60-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_E-08-60-N-ok.out Thu May 23 20:36:04 2024
----- ZONE 1 ----
*** 1 ****
- 135
--- 0 ----
output differs from expected
---------------------------E-09-61-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 1 10 29 28 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 1 10 29 28 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 1 10 29 28 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("29")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 1 10 29 28 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 1 10 29 28 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 1 10 29 28 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 28 44 91 79 52 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 44 91 79 52 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 44 91 79 52 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 28 44 91 79 52 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 28 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 1 10 29 28 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 1 10 29 28 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
3: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/E-09-61-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_E-09-61-N-ok.out Thu May 23 20:36:04 2024
----- ZONE 1 ----
*** 1 ****
- 01234567891011121314151617181920212223242526272829
--- 0 ----
output differs from expected
---------------------------E-10-62-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 1 10 29 28 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 1 10 29 28 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 1 10 29 28 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("29")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 1 10 29 28 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 1 10 29 28 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 1 10 29 28 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 29 28 44 91 79 52 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 28 45 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("%")
Next token is token '%' ()
Shifting token '%' ()
Entering state 71
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 122
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 122
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 122 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 167
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 122 167
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 199
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 122 167 199
Reducing stack by rule 62 (line 155):
$1 = token '(' ()
$2 = token '%' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 111
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 29 28 44 91 79 52 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 178
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 139 178
Reducing stack by rule 40 (line 127):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 28 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 1 10 29 28 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 1 10 29 28 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
6: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/E-10-62-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_E-10-62-N-ok.out Thu May 23 20:36:04 2024
----- ZONE 1 ----
*** 1 ****
- 0246810121416182022242628
--- 0 ----
output differs from expected
---------------------------E-11-63-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 1 10 29 28 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 1 10 29 28 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 1 10 29 28 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("29")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 1 10 29 28 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 1 10 29 28 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 1 10 29 28 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 29 28 44 91 79 52 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 28 45 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("%")
Next token is token '%' ()
Shifting token '%' ()
Entering state 71
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 122
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 122
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 122 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 167
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 122 167
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 199
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 122 167 199
Reducing stack by rule 62 (line 155):
$1 = token '(' ()
$2 = token '%' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 111
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 29 28 44 91 79 52 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("14")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 28 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31 79 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31 79 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 178
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 139 178
Reducing stack by rule 40 (line 127):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 28 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 1 10 29 28 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 1 10 29 28 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
9: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/E-11-63-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_E-11-63-N-ok.out Thu May 23 20:36:04 2024
----- ZONE 1 ----
*** 1 ****
- 1516182022242628
--- 0 ----
output differs from expected
---------------------------E-12-64-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 10 28 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 10 28 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 12 37 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 10 28 12 37 83
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 10 28 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 1 10 29 28 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 1 10 29 28 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 1 10 29 28 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("29")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 1 10 29 28 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 1 10 29 28 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 1 10 29 28 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 28 44 91 79 52 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 44 91 79 52 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 44 91 79 52 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 28 44 91 79 52 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 28 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 1 10 29 28 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 1 10 29 28 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
3: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/E-12-64-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_E-12-64-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
- 01234567891011121314151617181920212223242526272829
--- 0 ----
output differs from expected
---------------------------E-13-65-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 10 28 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 10 28 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 12 37 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 10 28 12 37 83
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 10 28 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 1 10 29 28 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 1 10 29 28 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 1 10 29 28 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("29")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 1 10 29 28 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 1 10 29 28 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 1 10 29 28 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 29 28 44 91 79 52 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 28 45 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("%")
Next token is token '%' ()
Shifting token '%' ()
Entering state 71
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 122
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 122
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 122 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 167
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 122 167
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 199
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 122 167 199
Reducing stack by rule 62 (line 155):
$1 = token '(' ()
$2 = token '%' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 111
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 29 28 44 91 79 52 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 178
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 139 178
Reducing stack by rule 40 (line 127):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 28 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 1 10 29 28 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 1 10 29 28 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
6: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/E-13-65-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_E-13-65-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
- 0246810121416182022242628
--- 0 ----
output differs from expected
---------------------------E-14-66-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 10 28 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 10 28 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 12 37 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 10 28 12 37 83
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 10 28 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 1 10 29 28 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 1 10 29 28 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 1 10 29 28 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("29")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 1 10 29 28 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 1 10 29 28 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 1 10 29 28 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 29 28 44 91 79 52 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 28 45 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("%")
Next token is token '%' ()
Shifting token '%' ()
Entering state 71
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 122
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 122
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 122 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 167
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 122 167
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 199
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 82 71 122 167 199
Reducing stack by rule 62 (line 155):
$1 = token '(' ()
$2 = token '%' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 111
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 1 10 29 28 44 91 79 52 28 45 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 29 28 44 91 79 52 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("14")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 28 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 28 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31 79 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31 79 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 178
Stack now 0 1 10 29 28 44 91 79 52 28 45 92 139 178
Reducing stack by rule 40 (line 127):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 28 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 1 10 29 28 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 1 10 29 28 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
9: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/E-14-66-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_E-14-66-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
- 1516182022242628
--- 0 ----
output differs from expected
---------------------------F-01-67-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 1 10 29 28 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 1 10 29 28 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 1 10 29 28 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 1 10 29 28 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 1 10 29 28 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 1 10 29 28 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 29 28 44 91 79 52 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 29 28 44 91 79 52 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 29 28 44 91 79 52 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 10 29 28 44 91 79 52 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 10 29 28 44 91 79 52 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 29 28 44 91 79 52 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29 28 44 91 79 52 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 1 10 29 28 44 91 79 52 29 28 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("6")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("%")
Next token is token '%' ()
Shifting token '%' ()
Entering state 71
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 82 71
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 82 71 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 82 71 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 122
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 82 71 122
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 82 71 122 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 167
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 82 71 122 167
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 199
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 82 71 122 167 199
Reducing stack by rule 62 (line 155):
$1 = token '(' ()
$2 = token '%' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 111
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 28 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 28 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 28 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 28 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 28 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 28 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 28 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 52("next")
Next token is token tNEXT ()
Shifting token tNEXT ()
Entering state 54
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 31 79 54
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 104
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 31 79 54 104
Reducing stack by rule 44 (line 131):
$1 = token '(' ()
$2 = token tNEXT ()
$3 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 79 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 79 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 28 44 91 79 52 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 28 44 91 79 52 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 28 44 91 79 52 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 1 10 29 28 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 1 10 29 28 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
12: undeclared variable 'y'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/F-01-67-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_F-01-67-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
- 123456
--- 0 ----
output differs from expected
---------------------------F-02-68-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 1 10 29 28 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 1 10 29 28 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 1 10 29 28 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 1 10 29 28 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 1 10 29 28 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 1 10 29 28 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 29 28 44 91 79 52 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 29 28 44 91 79 52 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 29 28 44 91 79 52 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 10 29 28 44 91 79 52 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 10 29 28 44 91 79 52 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 29 28 44 91 79 52 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29 28 44 91 79 52 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 1 10 29 28 44 91 79 52 29 28 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("6")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("%")
Next token is token '%' ()
Shifting token '%' ()
Entering state 71
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 82 71
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 82 71 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 82 71 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 122
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 82 71 122
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 82 71 122 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 167
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 82 71 122 167
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 199
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 82 71 122 167 199
Reducing stack by rule 62 (line 155):
$1 = token '(' ()
$2 = token '%' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 111
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 51("stop")
Next token is token tSTOP ()
Shifting token tSTOP ()
Entering state 53
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 53
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 102
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 79 53 102
Reducing stack by rule 42 (line 129):
$1 = token '(' ()
$2 = token tSTOP ()
$3 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 79 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 79 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 28 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 1 10 29 28 44 91 79 52 29 28 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 28 44 91 79 52 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 28 44 91 79 52 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 28 44 91 79 52 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 1 10 29 28 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 1 10 29 28 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
10: undeclared variable 'y'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/F-02-68-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_F-02-68-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
- 123456123456
--- 0 ----
output differs from expected
---------------------------F-03-69-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 1 10 29 28 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 29("<=")
Next token is token tLE ()
Shifting token tLE ()
Entering state 59
Stack now 0 1 10 29 28 44 82 59
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 82 59 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 82 59 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 110
Stack now 0 1 10 29 28 44 82 59 110
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 82 59 110 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 153
Stack now 0 1 10 29 28 44 82 59 110 153
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 188
Stack now 0 1 10 29 28 44 82 59 110 153 188
Reducing stack by rule 66 (line 159):
$1 = token '(' ()
$2 = token tLE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 1 10 29 28 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 29 28 44 91 79 52 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 29 28 44 91 79 52 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 29 28 44 91 79 52 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 10 29 28 44 91 79 52 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 10 29 28 44 91 79 52 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 29 28 44 91 79 52 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29 28 44 91 79 52 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 28 44 91 79 52 29 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("I")
--(end of buffer or a NUL)
--accepting rule at line 66(" ")
--(end of buffer or a NUL)
--accepting rule at line 66("E")
--(end of buffer or a NUL)
--accepting rule at line 66("R")
--(end of buffer or a NUL)
--accepting rule at line 66(" ")
--(end of buffer or a NUL)
--accepting rule at line 66("x")
--(end of buffer or a NUL)
--accepting rule at line 66("=")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 29 28 44 91 79 52 29 28 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 44 91 79 52 29 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 44 91 79 52 29 28 47 95
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 28 47 95 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 28 47 95 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 1 10 29 28 44 91 79 52 29 28 47 95 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 44 91 79 52 29 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 28 44 91 79 52 29 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 28 44 91 79 52 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 28(">=")
Next token is token tGE ()
Shifting token tGE ()
Entering state 58
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 82 58
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 82 58 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 82 58 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 109
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 82 58 109
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 82 58 109 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 152
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 82 58 109 152
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 187
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 82 58 109 152 187
Reducing stack by rule 65 (line 158):
$1 = token '(' ()
$2 = token tGE ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 32("&&")
Next token is token tAND ()
Shifting token tAND ()
Entering state 65
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 82 60 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 82 60 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 116
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 116
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 116 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 116 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 116 82 60 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 116 82 60 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 116 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 116 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 116 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 116 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 159
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 116 159
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 193
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 82 65 116 159 193
Reducing stack by rule 70 (line 163):
$1 = token '(' ()
$2 = token tAND ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 51("stop")
Next token is token tSTOP ()
Shifting token tSTOP ()
Entering state 53
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 92 79 53
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 101
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 92 79 53 101
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 147
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 92 79 53 101 147
Reducing stack by rule 43 (line 130):
$1 = token '(' ()
$2 = token tSTOP ()
$3 = token tINTEGER ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 92 139
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 178
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 45 92 139 178
Reducing stack by rule 40 (line 127):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 56 107 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 56 107 82 68 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 56 107 82 68 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 56 107 82 68 119
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 56 107 82 68 119 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 164
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 56 107 82 68 119 164
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 196
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 56 107 82 68 119 164 196
Reducing stack by rule 59 (line 152):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 28 44 91 79 52 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 28 44 91 79 52 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 44 91 79 52 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 28 44 91 79 52 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 28 44 91 79 52 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 28 44 91 79 52 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 10 29 28 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 10 29 28 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 1 10 29 28 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 1 10 29 28 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 77 79 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 77 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 77 79 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
12: undeclared variable 'x'
13: undeclared variable 'x'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/F-03-69-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_F-03-69-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1,9 ****
- I ER x=1
- 3
- 2
- 1
- 0
- I ER x=2
- 3
- 2
- 2
--- 0 ----
output differs from expected
---------------------------G-01-70-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 27("sizeof")
Next token is token tSIZEOF ()
Shifting token tSIZEOF ()
Entering state 57
Stack now 0 1 10 28 47 82 57
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 57 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 108
Stack now 0 1 10 28 47 82 57 108
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 151
Stack now 0 1 10 28 47 82 57 108 151
Reducing stack by rule 75 (line 168):
$1 = token '(' ()
$2 = token tSIZEOF ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/G-01-70-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_G-01-70-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
! 4
--- 1 ----
! 0
output differs from expected
---------------------------G-02-71-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 27("sizeof")
Next token is token tSIZEOF ()
Shifting token tSIZEOF ()
Entering state 57
Stack now 0 1 10 28 47 82 57
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("1.1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 1 10 28 47 82 57 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 108
Stack now 0 1 10 28 47 82 57 108
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 151
Stack now 0 1 10 28 47 82 57 108 151
Reducing stack by rule 75 (line 168):
$1 = token '(' ()
$2 = token tSIZEOF ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/G-02-71-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_G-02-71-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
! 8
--- 1 ----
! 0
output differs from expected
---------------------------G-03-72-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 27("sizeof")
Next token is token tSIZEOF ()
Shifting token tSIZEOF ()
Entering state 57
Stack now 0 1 10 28 47 82 57
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 47("null")
Next token is token tNULL ()
Shifting token tNULL ()
Entering state 27
Stack now 0 1 10 28 47 82 57 27
Reducing stack by rule 55 (line 148):
$1 = token tNULL ()
-> $$ = nterm expr ()
Entering state 108
Stack now 0 1 10 28 47 82 57 108
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 151
Stack now 0 1 10 28 47 82 57 108 151
Reducing stack by rule 75 (line 168):
$1 = token '(' ()
$2 = token tSIZEOF ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/G-03-72-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_G-03-72-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
! 4
--- 1 ----
! 0
output differs from expected
---------------------------G-04-73-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 27("sizeof")
Next token is token tSIZEOF ()
Shifting token tSIZEOF ()
Entering state 57
Stack now 0 1 10 28 47 82 57
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("o")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("á")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 10 28 47 82 57 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 108
Stack now 0 1 10 28 47 82 57 108
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 151
Stack now 0 1 10 28 47 82 57 108 151
Reducing stack by rule 75 (line 168):
$1 = token '(' ()
$2 = token tSIZEOF ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/G-04-73-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_G-04-73-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
! 4
--- 1 ----
! 0
output differs from expected
---------------------------G-05-74-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 27("sizeof")
Next token is token tSIZEOF ()
Shifting token tSIZEOF ()
Entering state 57
Stack now 0 4 1 10 28 47 82 57
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 57 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 57 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 108
Stack now 0 4 1 10 28 47 82 57 108
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 151
Stack now 0 4 1 10 28 47 82 57 108 151
Reducing stack by rule 75 (line 168):
$1 = token '(' ()
$2 = token tSIZEOF ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/G-05-74-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_G-05-74-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
! 4
--- 1 ----
! 0
output differs from expected
---------------------------G-06-75-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("1.1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 1 12 37 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 27("sizeof")
Next token is token tSIZEOF ()
Shifting token tSIZEOF ()
Entering state 57
Stack now 0 4 1 10 28 47 82 57
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 57 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 57 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 108
Stack now 0 4 1 10 28 47 82 57 108
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 151
Stack now 0 4 1 10 28 47 82 57 108 151
Reducing stack by rule 75 (line 168):
$1 = token '(' ()
$2 = token tSIZEOF ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/G-06-75-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_G-06-75-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
! 8
--- 1 ----
! 0
output differs from expected
---------------------------G-07-76-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 46("void")
Next token is token tVOID_TYPE ()
Shifting token tVOID_TYPE ()
Entering state 9
Stack now 0 1 12 37 82 51 99 9
Reducing stack by rule 26 (line 105):
$1 = token tVOID_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 182
Stack now 0 1 12 37 82 51 99 145 182
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 182 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 12 37 82 51 99 145 182 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("1.1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 1 12 37 82 51 99 145 182 28 47 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 12 37 82 51 99 145 182 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 12 37 82 51 99 145 182 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 12 37 82 51 99 145 182 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 182 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 182 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 203
Stack now 0 1 12 37 82 51 99 145 182 203
Next token is token ')' ()
Shifting token ')' ()
Entering state 206
Stack now 0 1 12 37 82 51 99 145 182 203 206
Reducing stack by rule 85 (line 180):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = token ')' ()
$6 = nterm block ()
$7 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 27("sizeof")
Next token is token tSIZEOF ()
Shifting token tSIZEOF ()
Entering state 57
Stack now 0 4 1 10 28 47 82 57
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 57 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 57 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 108
Stack now 0 4 1 10 28 47 82 57 108
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 151
Stack now 0 4 1 10 28 47 82 57 108 151
Reducing stack by rule 75 (line 168):
$1 = token '(' ()
$2 = token tSIZEOF ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/G-07-76-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_G-07-76-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
! 4
--- 1 ----
! 0
output differs from expected
---------------------------G-08-77-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 12 37 82 51 99 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 182
Stack now 0 1 12 37 82 51 99 145 182
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 182 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 182 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("1.1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 1 12 37 82 51 99 145 182 28 49 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 182 28 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 182 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 182 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 182 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 203
Stack now 0 1 12 37 82 51 99 145 182 203
Next token is token ')' ()
Shifting token ')' ()
Entering state 206
Stack now 0 1 12 37 82 51 99 145 182 203 206
Reducing stack by rule 85 (line 180):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = token ')' ()
$6 = nterm block ()
$7 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 27("sizeof")
Next token is token tSIZEOF ()
Shifting token tSIZEOF ()
Entering state 57
Stack now 0 4 1 10 28 47 82 57
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82 57 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 57 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 57 82 75
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 57 82 76
Next token is token ')' ()
Shifting token ')' ()
Entering state 127
Stack now 0 4 1 10 28 47 82 57 82 76 127
Reducing stack by rule 78 (line 171):
$1 = token '(' ()
$2 = nterm expr ()
$3 = token ')' ()
-> $$ = nterm expr ()
Entering state 108
Stack now 0 4 1 10 28 47 82 57 108
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 151
Stack now 0 4 1 10 28 47 82 57 108 151
Reducing stack by rule 75 (line 168):
$1 = token '(' ()
$2 = token tSIZEOF ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/G-08-77-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_G-08-77-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
! 8
--- 1 ----
! 0
output differs from expected
---------------------------J-01-78-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 46("void")
Next token is token tVOID_TYPE ()
Shifting token tVOID_TYPE ()
Entering state 9
Stack now 0 1 12 37 82 51 99 9
Reducing stack by rule 26 (line 105):
$1 = token tVOID_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 182
Stack now 0 1 12 37 82 51 99 145 182
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 182 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 12 37 82 51 99 145 182 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("o")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("a")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 12 37 82 51 99 145 182 28 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 12 37 82 51 99 145 182 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 12 37 82 51 99 145 182 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 12 37 82 51 99 145 182 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 182 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 182 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 203
Stack now 0 1 12 37 82 51 99 145 182 203
Next token is token ')' ()
Shifting token ')' ()
Entering state 206
Stack now 0 1 12 37 82 51 99 145 182 203 206
Reducing stack by rule 85 (line 180):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = token ')' ()
$6 = nterm block ()
$7 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 75
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 76
Next token is token ')' ()
Shifting token ')' ()
Entering state 127
Stack now 0 4 1 10 28 76 127
Reducing stack by rule 78 (line 171):
$1 = token '(' ()
$2 = nterm expr ()
$3 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/J-01-78-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_J-01-78-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
- ola
--- 0 ----
output differs from expected
---------------------------J-02-79-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 182
Stack now 0 1 12 37 82 51 99 145 182
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 182 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 182 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 182 28 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 182 28 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 182 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 182 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 182 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 203
Stack now 0 1 12 37 82 51 99 145 182 203
Next token is token ')' ()
Shifting token ')' ()
Entering state 206
Stack now 0 1 12 37 82 51 99 145 182 203 206
Reducing stack by rule 85 (line 180):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = token ')' ()
$6 = nterm block ()
$7 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token ')' ()
Shifting token ')' ()
Entering state 127
Stack now 0 4 1 10 28 47 82 76 127
Reducing stack by rule 78 (line 171):
$1 = token '(' ()
$2 = nterm expr ()
$3 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/J-02-79-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_J-02-79-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
! 2
--- 1 ----
! 0
output differs from expected
---------------------------J-03-80-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 45("string")
Next token is token tSTRING_TYPE ()
Shifting token tSTRING_TYPE ()
Entering state 8
Stack now 0 1 12 37 82 51 99 8
Reducing stack by rule 25 (line 104):
$1 = token tSTRING_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 182
Stack now 0 1 12 37 82 51 99 145 182
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 182 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 182 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("o")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("a")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 1 12 37 82 51 99 145 182 28 49 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 182 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 182 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 182 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 182 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 203
Stack now 0 1 12 37 82 51 99 145 182 203
Next token is token ')' ()
Shifting token ')' ()
Entering state 206
Stack now 0 1 12 37 82 51 99 145 182 203 206
Reducing stack by rule 85 (line 180):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = token ')' ()
$6 = nterm block ()
$7 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token ')' ()
Shifting token ')' ()
Entering state 127
Stack now 0 4 1 10 28 47 82 76 127
Reducing stack by rule 78 (line 171):
$1 = token '(' ()
$2 = nterm expr ()
$3 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/J-03-80-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_J-03-80-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
! ola
--- 1 ----
! 0
output differs from expected
---------------------------J-04-81-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 58("forward")
Next token is token tFORWARD ()
Shifting token tFORWARD ()
Entering state 14
Stack now 0 1 14
Reducing stack by rule 8 (line 77):
$1 = token tFORWARD ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 1 16
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 1 16 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 46("void")
Next token is token tVOID_TYPE ()
Shifting token tVOID_TYPE ()
Entering state 9
Stack now 0 1 16 15 9
Reducing stack by rule 26 (line 105):
$1 = token tVOID_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 16 15 39
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 86
Stack now 0 1 16 15 39 86
Reducing stack by rule 19 (line 94):
$1 = token '(' ()
$2 = nterm type ()
$3 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 16 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 41
Stack now 0 1 16 41
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 88
Stack now 0 1 16 41 88
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 135
Stack now 0 1 16 41 88 135
Reducing stack by rule 11 (line 84):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = nterm type ()
$4 = token tIDENTIFIER ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 59("public")
Next token is token tPUBLIC ()
Shifting token tPUBLIC ()
Entering state 11
Stack now 0 4 1 11
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Reducing stack by rule 6 (line 75):
$1 = token tPUBLIC ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 4 1 16
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 40
Stack now 0 4 1 16 40
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 16 40 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 16 40 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 16 40 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 46("void")
Next token is token tVOID_TYPE ()
Shifting token tVOID_TYPE ()
Entering state 9
Stack now 0 4 1 16 40 82 51 99 9
Reducing stack by rule 26 (line 105):
$1 = token tVOID_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 16 40 82 51 99 145
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 182
Stack now 0 4 1 16 40 82 51 99 145 182
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 16 40 82 51 99 145 182 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 16 40 82 51 99 145 182 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 16 40 82 51 99 145 182 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 16 40 82 51 99 145 182 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 16 40 82 51 99 145 182 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 16 40 82 51 99 145 182 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 16 40 82 51 99 145 182 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 16 40 82 51 99 145 182 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 16 40 82 51 99 145 182 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 16 40 82 51 99 145 182 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 16 40 82 51 99 145 182 29 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 182 29 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 16 40 82 51 99 145 182 29 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 16 40 82 51 99 145 182 29 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 16 40 82 51 99 145 182 29 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 16 40 82 51 99 145 182 29 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 16 40 82 51 99 145 182 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 16 40 82 51 99 145 182 29 77
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 203
Stack now 0 4 1 16 40 82 51 99 145 182 203
Next token is token ')' ()
Shifting token ')' ()
Entering state 206
Stack now 0 4 1 16 40 82 51 99 145 182 203 206
Reducing stack by rule 85 (line 180):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = token ')' ()
$6 = nterm block ()
$7 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 16 40 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 87
Stack now 0 4 1 16 40 87
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 134
Stack now 0 4 1 16 40 87 134
Reducing stack by rule 16 (line 89):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 75
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 76
Next token is token ')' ()
Shifting token ')' ()
Entering state 127
Stack now 0 4 1 10 28 76 127
Reducing stack by rule 78 (line 171):
$1 = token '(' ()
$2 = nterm expr ()
$3 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/J-04-81-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_J-04-81-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
- 3
--- 0 ----
output differs from expected
---------------------------J-05-82-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("pi")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 182
Stack now 0 1 12 37 82 51 99 145 182
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 182 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 182 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("314")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 182 28 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 182 28 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 182 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 182 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 182 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 203
Stack now 0 1 12 37 82 51 99 145 182 203
Next token is token ')' ()
Shifting token ')' ()
Entering state 206
Stack now 0 1 12 37 82 51 99 145 182 203 206
Reducing stack by rule 85 (line 180):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = token ')' ()
$6 = nterm block ()
$7 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("pi")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token ')' ()
Shifting token ')' ()
Entering state 127
Stack now 0 4 1 10 28 47 82 76 127
Reducing stack by rule 78 (line 171):
$1 = token '(' ()
$2 = nterm expr ()
$3 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/J-05-82-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_J-05-82-N-ok.out Thu May 23 20:36:05 2024
----- ZONE 1 ----
*** 1 ****
! 314
--- 1 ----
! 0
output differs from expected
---------------------------J-06-83-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 57("external")
Next token is token tEXTERNAL ()
Shifting token tEXTERNAL ()
Entering state 13
Stack now 0 1 13
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Reducing stack by rule 7 (line 76):
$1 = token tEXTERNAL ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 1 16
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 1 16 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 16 15 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 16 15 39
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 86
Stack now 0 1 16 15 39 86
Reducing stack by rule 19 (line 94):
$1 = token '(' ()
$2 = nterm type ()
$3 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 16 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 41
Stack now 0 1 16 41
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("argc")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 88
Stack now 0 1 16 41 88
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 135
Stack now 0 1 16 41 88 135
Reducing stack by rule 11 (line 84):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = nterm type ()
$4 = token tIDENTIFIER ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("argc")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token ')' ()
Shifting token ')' ()
Entering state 127
Stack now 0 4 1 10 28 47 82 76 127
Reducing stack by rule 78 (line 171):
$1 = token '(' ()
$2 = nterm expr ()
$3 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/J-06-83-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_J-06-83-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
! 1
--- 1 ----
! 0
output differs from expected
---------------------------J-07-84-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 46("void")
Next token is token tVOID_TYPE ()
Shifting token tVOID_TYPE ()
Entering state 9
Stack now 0 1 12 37 82 51 99 9
Reducing stack by rule 26 (line 105):
$1 = token tVOID_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 182
Stack now 0 1 12 37 82 51 99 145 182
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 182 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 182 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 182 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("main")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 182 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 182 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 12 37 82 51 99 145 182 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 12 37 82 51 99 145 182 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 12 37 82 51 99 145 182 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 12 37 82 51 99 145 182 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 182 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 12 37 82 51 99 145 182 29 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 82 67 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("*")
Next token is token '*' ()
Shifting token '*' ()
Entering state 69
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 82 67 82 69
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 82 67 82 69 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 120
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 82 67 82 69 120
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("main")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 82 67 82 69 120 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 82 67 82 69 120 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 165
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 82 67 82 69 120 165
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 197
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 82 67 82 69 120 165 197
Reducing stack by rule 60 (line 153):
$1 = token '(' ()
$2 = token '*' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 82 67 118
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("main")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 82 67 118 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 82 67 118 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 12 37 82 51 99 145 182 29 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 182 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 12 37 82 51 99 145 182 29 77
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 203
Stack now 0 1 12 37 82 51 99 145 182 203
Next token is token ')' ()
Shifting token ')' ()
Entering state 206
Stack now 0 1 12 37 82 51 99 145 182 203 206
Reducing stack by rule 85 (line 180):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = token ')' ()
$6 = nterm block ()
$7 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 75
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 76
Next token is token ')' ()
Shifting token ')' ()
Entering state 127
Stack now 0 4 1 10 28 76 127
Reducing stack by rule 78 (line 171):
$1 = token '(' ()
$2 = nterm expr ()
$3 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/J-07-84-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_J-07-84-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
- 3
--- 0 ----
output differs from expected
---------------------------J-08-85-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 1 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 15 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 15 39
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 86
Stack now 0 1 15 39 86
Reducing stack by rule 19 (line 94):
$1 = token '(' ()
$2 = nterm type ()
$3 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 18 42 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 18 42 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 18 42 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 18 42 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 18 42 82 51 99 145
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 182
Stack now 0 1 18 42 82 51 99 145 182
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 18 42 82 51 99 145 182 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 18 42 82 51 99 145 182 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 82 51 99 145 182 28 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 18 42 82 51 99 145 182 28 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 18 42 82 51 99 145 182 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 18 42 82 51 99 145 182 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 18 42 82 51 99 145 182 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 203
Stack now 0 1 18 42 82 51 99 145 182 203
Next token is token ')' ()
Shifting token ')' ()
Entering state 206
Stack now 0 1 18 42 82 51 99 145 182 203 206
Reducing stack by rule 85 (line 180):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = token ')' ()
$6 = nterm block ()
$7 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 18 42 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token ')' ()
Shifting token ')' ()
Entering state 127
Stack now 0 4 1 10 28 47 82 76 127
Reducing stack by rule 78 (line 171):
$1 = token '(' ()
$2 = nterm expr ()
$3 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/J-08-85-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_J-08-85-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
! 2
--- 1 ----
! 0
output differs from expected
---------------------------K-01-86-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 59("public")
Next token is token tPUBLIC ()
Shifting token tPUBLIC ()
Entering state 11
Stack now 0 1 11
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Reducing stack by rule 6 (line 75):
$1 = token tPUBLIC ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 1 16
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 16 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 41
Stack now 0 1 16 41
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 88
Stack now 0 1 16 41 88
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 16 41 88 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 136
Stack now 0 1 16 41 88 136
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 176
Stack now 0 1 16 41 88 136 176
Reducing stack by rule 13 (line 86):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = nterm type ()
$4 = token tIDENTIFIER ()
$5 = nterm expr ()
$6 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 4 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 4 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 46("void")
Next token is token tVOID_TYPE ()
Shifting token tVOID_TYPE ()
Entering state 9
Stack now 0 4 1 12 37 82 51 99 9
Reducing stack by rule 26 (line 105):
$1 = token tVOID_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 12 37 82 51 99 145
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 182
Stack now 0 4 1 12 37 82 51 99 145 182
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 182 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 182 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 182 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 182 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 12 37 82 51 99 145 182 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 12 37 82 51 99 145 182 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 12 37 82 51 99 145 182 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 12 37 82 51 99 145 182 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 12 37 82 51 99 145 182 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 182 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 12 37 82 51 99 145 182 29 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 182 29 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 182 29 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 12 37 82 51 99 145 182 29 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 12 37 82 51 99 145 182 29 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 12 37 82 51 99 145 182 29 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 12 37 82 51 99 145 182 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 12 37 82 51 99 145 182 29 77
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 203
Stack now 0 4 1 12 37 82 51 99 145 182 203
Next token is token ')' ()
Shifting token ')' ()
Entering state 206
Stack now 0 4 1 12 37 82 51 99 145 182 203 206
Reducing stack by rule 85 (line 180):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = token ')' ()
$6 = nterm block ()
$7 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 4 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 4 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 75
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 76
Next token is token ')' ()
Shifting token ')' ()
Entering state 127
Stack now 0 4 1 10 28 76 127
Reducing stack by rule 78 (line 171):
$1 = token '(' ()
$2 = nterm expr ()
$3 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/K-01-86-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_K-01-86-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
- 310
--- 0 ----
output differs from expected
---------------------------K-02-87-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 46("void")
Next token is token tVOID_TYPE ()
Shifting token tVOID_TYPE ()
Entering state 9
Stack now 0 1 12 37 82 51 99 9
Reducing stack by rule 26 (line 105):
$1 = token tVOID_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 12 37 82 51 99 145 184 204 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/K-02-87-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_K-02-87-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
- 3
--- 0 ----
output differs from expected
---------------------------K-03-88-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 46("void")
Next token is token tVOID_TYPE ()
Shifting token tVOID_TYPE ()
Entering state 9
Stack now 0 1 12 37 82 51 99 9
Reducing stack by rule 26 (line 105):
$1 = token tVOID_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 184 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 184 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 184 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 184 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 184 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 184 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 205
Stack now 0 1 12 37 82 51 99 145 184 205
Reducing stack by rule 87 (line 184):
$1 = nterm functionArgs ()
$2 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 12 37 82 51 99 145 184 204 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 82 67 118 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 82 67 118 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("4")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 76 128 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 4 1 10 28 76 128 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/K-03-88-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_K-03-88-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
- 7
--- 0 ----
output differs from expected
---------------------------K-04-89-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/K-04-89-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_K-04-89-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
! 4
--- 1 ----
! 0
output differs from expected
---------------------------K-05-90-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 12 37 82 51 99 145 184 204 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("5")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 12 37 82 51 99 145 184 204 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 12 37 82 51 99 145 184 204 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 118 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 118 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 12 37 82 51 99 145 184 204 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/K-05-90-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_K-05-90-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
! 6
--- 1 ----
! 0
output differs from expected
---------------------------K-06-91-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 184 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 184 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 184 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 184 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 184 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 184 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 205
Stack now 0 1 12 37 82 51 99 145 184 205
Reducing stack by rule 87 (line 184):
$1 = nterm functionArgs ()
$2 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 12 37 82 51 99 145 184 204 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("5")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 12 37 82 51 99 145 184 204 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 12 37 82 51 99 145 184 204 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 82 67 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 82 67 118 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 82 67 118 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 118 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 118 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 12 37 82 51 99 145 184 204 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("4")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 47 82 76 128 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 4 1 10 28 47 82 76 128 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/K-06-91-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_K-06-91-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
! 10
--- 1 ----
! 0
output differs from expected
---------------------------K-07-92-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 45("string")
Next token is token tSTRING_TYPE ()
Shifting token tSTRING_TYPE ()
Entering state 8
Stack now 0 1 12 37 82 51 99 145 181 8
Reducing stack by rule 25 (line 104):
$1 = token tSTRING_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("s")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 12 37 82 51 99 145 184 204 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("s")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 12 37 82 51 99 145 184 204 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 12 37 82 51 99 145 184 204 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 12 37 82 51 99 145 184 204 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("o")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("a")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 76
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 4 1 10 28 76 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/K-07-92-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_K-07-92-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
- ola
--- 0 ----
output differs from expected
---------------------------K-08-93-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 58("forward")
Next token is token tFORWARD ()
Shifting token tFORWARD ()
Entering state 14
Stack now 0 1 14
Reducing stack by rule 8 (line 77):
$1 = token tFORWARD ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 1 16
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 1 16 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 16 15 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 16 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 1 16 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 16 15 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 1 16 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 1 16 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 1 16 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 1 16 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 16 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 41
Stack now 0 1 16 41
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 88
Stack now 0 1 16 41 88
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 135
Stack now 0 1 16 41 88 135
Reducing stack by rule 11 (line 84):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = nterm type ()
$4 = token tIDENTIFIER ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 59("public")
Next token is token tPUBLIC ()
Shifting token tPUBLIC ()
Entering state 11
Stack now 0 4 1 11
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Reducing stack by rule 6 (line 75):
$1 = token tPUBLIC ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 4 1 16
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 40
Stack now 0 4 1 16 40
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 16 40 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 16 40 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 16 40 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 16 40 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 16 40 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 16 40 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 45("string")
Next token is token tSTRING_TYPE ()
Shifting token tSTRING_TYPE ()
Entering state 8
Stack now 0 4 1 16 40 82 51 99 145 181 8
Reducing stack by rule 25 (line 104):
$1 = token tSTRING_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 16 40 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("s")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 16 40 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 16 40 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 16 40 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 16 40 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 16 40 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 16 40 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 16 40 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("s")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 16 40 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 16 40 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 16 40 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 16 40 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 16 40 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 16 40 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 87
Stack now 0 4 1 16 40 87
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 134
Stack now 0 4 1 16 40 87 134
Reducing stack by rule 16 (line 89):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 59("public")
Next token is token tPUBLIC ()
Shifting token tPUBLIC ()
Entering state 11
Stack now 0 4 1 11
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Reducing stack by rule 6 (line 75):
$1 = token tPUBLIC ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 4 1 16
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 40
Stack now 0 4 1 16 40
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 16 40 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 16 40 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 16 40 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 16 40 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 16 40 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 16 40 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 16 40 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 16 40 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 16 40 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 16 40 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 16 40 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 16 40 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 16 40 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 16 40 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 16 40 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 16 40 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 16 40 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 16 40 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 16 40 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 16 40 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 16 40 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 87
Stack now 0 4 1 16 40 87
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 134
Stack now 0 4 1 16 40 87 134
Reducing stack by rule 16 (line 89):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("o")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("a")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 76
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 4 1 10 28 76 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/K-08-93-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_K-08-93-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
- ola
--- 0 ----
output differs from expected
---------------------------K-09-94-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 58("forward")
Next token is token tFORWARD ()
Shifting token tFORWARD ()
Entering state 14
Stack now 0 1 14
Reducing stack by rule 8 (line 77):
$1 = token tFORWARD ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 1 16
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 1 16 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 16 15 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 16 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 1 16 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 45("string")
Next token is token tSTRING_TYPE ()
Shifting token tSTRING_TYPE ()
Entering state 8
Stack now 0 1 16 15 39 85 8
Reducing stack by rule 25 (line 104):
$1 = token tSTRING_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 1 16 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 1 16 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 1 16 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 1 16 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 16 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 41
Stack now 0 1 16 41
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 88
Stack now 0 1 16 41 88
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 135
Stack now 0 1 16 41 88 135
Reducing stack by rule 11 (line 84):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = nterm type ()
$4 = token tIDENTIFIER ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 4 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 4 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 45("string")
Next token is token tSTRING_TYPE ()
Shifting token tSTRING_TYPE ()
Entering state 8
Stack now 0 4 1 12 37 82 51 99 145 181 8
Reducing stack by rule 25 (line 104):
$1 = token tSTRING_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("s")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("s")
Next token is token tIDENTIFIER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 76
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 76 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 76 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 12 37 82 51 99 145 184 204 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 4 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 4 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 59("public")
Next token is token tPUBLIC ()
Shifting token tPUBLIC ()
Entering state 11
Stack now 0 4 1 11
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Reducing stack by rule 6 (line 75):
$1 = token tPUBLIC ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 4 1 16
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 40
Stack now 0 4 1 16 40
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 16 40 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 16 40 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 16 40 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 16 40 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 16 40 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 16 40 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 45("string")
Next token is token tSTRING_TYPE ()
Shifting token tSTRING_TYPE ()
Entering state 8
Stack now 0 4 1 16 40 82 51 99 145 181 8
Reducing stack by rule 25 (line 104):
$1 = token tSTRING_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 16 40 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 16 40 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 16 40 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 16 40 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 16 40 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 16 40 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 16 40 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 16 40 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 16 40 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 16 40 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("14")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 16 40 82 51 99 145 184 204 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 16 40 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 16 40 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 16 40 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 16 40 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 87
Stack now 0 4 1 16 40 87
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 134
Stack now 0 4 1 16 40 87 134
Reducing stack by rule 16 (line 89):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("o")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("a")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 4 1 10 28 47 82 76 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/K-09-94-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_K-09-94-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
! ola10
--- 1 ----
! 0
output differs from expected
---------------------------K-10-95-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 58("forward")
Next token is token tFORWARD ()
Shifting token tFORWARD ()
Entering state 14
Stack now 0 1 14
Reducing stack by rule 8 (line 77):
$1 = token tFORWARD ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 1 16
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 1 16 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 16 15 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 16 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 1 16 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 45("string")
Next token is token tSTRING_TYPE ()
Shifting token tSTRING_TYPE ()
Entering state 8
Stack now 0 1 16 15 39 85 8
Reducing stack by rule 25 (line 104):
$1 = token tSTRING_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 1 16 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 1 16 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 1 16 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 1 16 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 16 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 41
Stack now 0 1 16 41
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 88
Stack now 0 1 16 41 88
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 135
Stack now 0 1 16 41 88 135
Reducing stack by rule 11 (line 84):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = nterm type ()
$4 = token tIDENTIFIER ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 4 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 4 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 45("string")
Next token is token tSTRING_TYPE ()
Shifting token tSTRING_TYPE ()
Entering state 8
Stack now 0 4 1 12 37 82 51 99 145 181 8
Reducing stack by rule 25 (line 104):
$1 = token tSTRING_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("s")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("s")
Next token is token tIDENTIFIER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 76
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 76 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 76 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 12 37 82 51 99 145 184 204 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 4 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 4 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 4 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 4 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 45("string")
Next token is token tSTRING_TYPE ()
Shifting token tSTRING_TYPE ()
Entering state 8
Stack now 0 4 1 12 37 82 51 99 145 181 8
Reducing stack by rule 25 (line 104):
$1 = token tSTRING_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("14")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 4 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 4 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("o")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("a")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 4 1 10 28 47 82 76 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/K-10-95-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_K-10-95-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
! ola10
--- 1 ----
! 0
output differs from expected
---------------------------K-11-96-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 58("forward")
Next token is token tFORWARD ()
Shifting token tFORWARD ()
Entering state 14
Stack now 0 1 14
Reducing stack by rule 8 (line 77):
$1 = token tFORWARD ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 1 16
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 1 16 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 16 15 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 16 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 1 16 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 16 15 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 1 16 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 1 16 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 1 16 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 1 16 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 16 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 41
Stack now 0 1 16 41
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 88
Stack now 0 1 16 41 88
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 135
Stack now 0 1 16 41 88 135
Reducing stack by rule 11 (line 84):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = nterm type ()
$4 = token tIDENTIFIER ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 4 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 4 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 45("string")
Next token is token tSTRING_TYPE ()
Shifting token tSTRING_TYPE ()
Entering state 8
Stack now 0 4 1 12 37 82 51 99 145 181 8
Reducing stack by rule 25 (line 104):
$1 = token tSTRING_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("s")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("s")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 4 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 4 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 4 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 4 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 12 37 82 51 99 145 184 204 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 4 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 4 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66("o")
--(end of buffer or a NUL)
--accepting rule at line 66("l")
--(end of buffer or a NUL)
--accepting rule at line 66("a")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 76
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 4 1 10 28 76 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/K-11-96-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_K-11-96-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
- ola
--- 0 ----
output differs from expected
---------------------------L-01-97-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 184 204 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 184 204 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 184 204 28 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 184 204 28 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 12 37 82 51 99 145 184 204 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 12 37 82 51 99 145 184 204 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 184 204 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 82 60 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 82 60 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 118 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("@")
Next token is token '@' ()
Shifting token '@' ()
Entering state 74
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 118 82 74
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 118 82 74 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 118 82 74 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 118 82 74 82 68 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 118 82 74 82 68 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 118 82 74 82 68 119
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 118 82 74 82 68 119 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 164
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 118 82 74 82 68 119 164
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 196
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 118 82 74 82 68 119 164 196
Reducing stack by rule 59 (line 152):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 118 82 74 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 125
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 118 82 74 125
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 169
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 118 82 74 125 169
Reducing stack by rule 81 (line 174):
$1 = token '(' ()
$2 = token '@' ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 118 162
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 31 79 49 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 31 79 49 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 1 12 37 82 51 99 145 184 204 29 28 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 184 204 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 12 37 82 51 99 145 184 204 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 12 37 82 51 99 145 184 204 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 184 204 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("9")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 184 204 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 184 204 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 184 204 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 12 37 82 51 99 145 184 204 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 12 37 82 51 99 145 184 204 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/L-01-97-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_L-01-97-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
! 15
--- 1 ----
! 0
output differs from expected
---------------------------L-02-98-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 58("forward")
Next token is token tFORWARD ()
Shifting token tFORWARD ()
Entering state 14
Stack now 0 1 14
Reducing stack by rule 8 (line 77):
$1 = token tFORWARD ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 1 16
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 1 16 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 16 15 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 16 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 1 16 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 16 15 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 1 16 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 1 16 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 1 16 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 1 16 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 16 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 41
Stack now 0 1 16 41
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 88
Stack now 0 1 16 41 88
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 135
Stack now 0 1 16 41 88 135
Reducing stack by rule 11 (line 84):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = nterm type ()
$4 = token tIDENTIFIER ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 59("public")
Next token is token tPUBLIC ()
Shifting token tPUBLIC ()
Entering state 11
Stack now 0 4 1 11
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Reducing stack by rule 6 (line 75):
$1 = token tPUBLIC ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 4 1 16
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 40
Stack now 0 4 1 16 40
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 16 40 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 16 40 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 16 40 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 16 40 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 16 40 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 16 40 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 16 40 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 16 40 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 16 40 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 16 40 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 16 40 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 16 40 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 16 40 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 16 40 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 16 40 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("9")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 16 40 82 51 99 145 184 204 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 16 40 82 51 99 145 184 204 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 82 60 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 82 60 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 119
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 119 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 164
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 119 164
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 196
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 119 164 196
Reducing stack by rule 59 (line 152):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 162
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77 79 49 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77 79 49 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 16 40 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 16 40 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 16 40 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 87
Stack now 0 4 1 16 40 87
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 134
Stack now 0 4 1 16 40 87 134
Reducing stack by rule 16 (line 89):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 59("public")
Next token is token tPUBLIC ()
Shifting token tPUBLIC ()
Entering state 11
Stack now 0 4 1 11
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Reducing stack by rule 6 (line 75):
$1 = token tPUBLIC ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 4 1 16
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 40
Stack now 0 4 1 16 40
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 16 40 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 16 40 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 16 40 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 16 40 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 16 40 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 16 40 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 16 40 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 16 40 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 16 40 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 16 40 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 16 40 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 16 40 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 16 40 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 16 40 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 16 40 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("9")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 16 40 82 51 99 145 184 204 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 16 40 82 51 99 145 184 204 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 82 60 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 82 60 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 119
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 119 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 164
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 119 164
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 196
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 119 164 196
Reducing stack by rule 59 (line 152):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 162
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 28 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77 79 49 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77 79 49 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 16 40 82 51 99 145 184 204 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 16 40 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 16 40 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 16 40 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 87
Stack now 0 4 1 16 40 87
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 134
Stack now 0 4 1 16 40 87 134
Reducing stack by rule 16 (line 89):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/L-02-98-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_L-02-98-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
! 6
--- 1 ----
! 0
output differs from expected
---------------------------L-03-99-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 58("forward")
Next token is token tFORWARD ()
Shifting token tFORWARD ()
Entering state 14
Stack now 0 1 14
Reducing stack by rule 8 (line 77):
$1 = token tFORWARD ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 1 16
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 1 16 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 16 15 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 16 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 1 16 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 16 15 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 1 16 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 1 16 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 1 16 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 1 16 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 16 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 41
Stack now 0 1 16 41
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 88
Stack now 0 1 16 41 88
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 135
Stack now 0 1 16 41 88 135
Reducing stack by rule 11 (line 84):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = nterm type ()
$4 = token tIDENTIFIER ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 4 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 4 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("9")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 12 37 82 51 99 145 184 204 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 12 37 82 51 99 145 184 204 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 82 60 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 82 60 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 119
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 119 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 164
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 119 164
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 196
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 119 164 196
Reducing stack by rule 59 (line 152):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 162
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77 79 49 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77 79 49 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 4 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 4 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 4 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 4 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("9")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 12 37 82 51 99 145 184 204 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 12 37 82 51 99 145 184 204 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 37("if")
Next token is token tIF ()
Shifting token tIF ()
Entering state 45
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 82 60 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 82 60 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 82 60 111 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 92
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 139
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 119
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 119 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 164
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 119 164
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 196
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 82 68 119 164 196
Reducing stack by rule 59 (line 152):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 162
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 179
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 179
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 202
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 28 45 92 139 179 202
Reducing stack by rule 41 (line 128):
$1 = token '(' ()
$2 = token tIF ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = nterm stmt ()
$6 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77 79 49 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77 79 49 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 12 37 82 51 99 145 184 204 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 4 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 4 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/L-03-99-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_L-03-99-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
! 6
--- 1 ----
! 0
output differs from expected
---------------------------O-01-100-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 12 37 82 51 99 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 184 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 12 37 82 51 99 145 184 181 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 184 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 184 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 184 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 184 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 205
Stack now 0 1 12 37 82 51 99 145 184 205
Reducing stack by rule 87 (line 184):
$1 = nterm functionArgs ()
$2 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 47 82 76 128 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 4 1 10 28 47 82 76 128 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 31 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 31 79 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 128 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 4 1 10 31 79 47 82 76 128 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 31 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: execution failed
*** expected/O-01-100-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_O-01-100-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
! 1.3E15
--- 1,2 ----
! 0
! 134516861
output differs from expected
---------------------------O-02-101-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 12 37 82 51 99 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 12 37 82 51 99 145 181 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 31 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 31 79 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 31 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: execution failed
*** expected/O-02-101-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_O-02-101-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
! 1E12
--- 1,2 ----
! 0
! 134516861
output differs from expected
---------------------------O-03-102-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 12 37 82 51 99 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 12 37 82 51 99 145 181 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("9")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 31 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 31 79 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 31 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: execution failed
*** expected/O-03-102-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_O-03-102-N-ok.out Thu May 23 20:36:06 2024
----- ZONE 1 ----
*** 1 ****
! 99
--- 1,2 ----
! 0
! 134516861
output differs from expected
---------------------------P-01-103-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 1 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 1 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 35("objects")
Next token is token tOBJECT ()
Shifting token tOBJECT ()
Entering state 55
Stack now 0 4 1 10 28 56 107 82 55
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 56 107 82 55 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 105
Stack now 0 4 1 10 28 56 107 82 55 105
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 149
Stack now 0 4 1 10 28 56 107 82 55 105 149
Reducing stack by rule 76 (line 169):
$1 = token '(' ()
$2 = token tOBJECT ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 31 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 31 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 31 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 31 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 31 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("6.2E3")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 4 1 10 31 79 56 107 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 31 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 31 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 31 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 31 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 31 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 31 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("3.1E3")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 4 1 10 31 79 56 107 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 31 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 31 79 47 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 31 79 47 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 31 79 47 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 31 79 47 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 31 79 47 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 31 79 47 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 31 79 47 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 31 79 47 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/P-01-103-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_P-01-103-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
- 6.2E33.1E3
--- 0 ----
output differs from expected
---------------------------P-02-104-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 1 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 1 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 4 1 10 28 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 4 1 10 28 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 47("null")
Next token is token tNULL ()
Shifting token tNULL ()
Entering state 27
Stack now 0 4 1 10 28 18 42 27
Reducing stack by rule 55 (line 148):
$1 = token tNULL ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 35("objects")
Next token is token tOBJECT ()
Shifting token tOBJECT ()
Entering state 55
Stack now 0 4 1 10 29 28 56 107 82 55
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 28 56 107 82 55 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 105
Stack now 0 4 1 10 29 28 56 107 82 55 105
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 149
Stack now 0 4 1 10 29 28 56 107 82 55 105 149
Reducing stack by rule 76 (line 169):
$1 = token '(' ()
$2 = token tOBJECT ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 35("objects")
Next token is token tOBJECT ()
Shifting token tOBJECT ()
Entering state 55
Stack now 0 4 1 10 29 77 79 56 107 82 55
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 82 55 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 105
Stack now 0 4 1 10 29 77 79 56 107 82 55 105
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 149
Stack now 0 4 1 10 29 77 79 56 107 82 55 105 149
Reducing stack by rule 76 (line 169):
$1 = token '(' ()
$2 = token tOBJECT ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("7")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("8")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 47 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 47 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 47 82 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 47 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 47 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 47 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 47 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 47 82 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 47 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 47 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 47 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 47 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 47 82 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 47 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 47 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/P-02-104-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_P-02-104-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
- 378
--- 0 ----
output differs from expected
---------------------------P-03-105-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 1 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 1 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("4")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 29 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 29 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 4 1 10 29 28 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 4 1 10 29 28 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 29 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 29 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 47("null")
Next token is token tNULL ()
Shifting token tNULL ()
Entering state 27
Stack now 0 4 1 10 29 28 18 42 27
Reducing stack by rule 55 (line 148):
$1 = token tNULL ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 29 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 29 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 1 10 29 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 29 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 29 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 29 28 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 10 29 28 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 1 10 29 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 35("objects")
Next token is token tOBJECT ()
Shifting token tOBJECT ()
Entering state 55
Stack now 0 4 1 10 29 28 56 107 82 55
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 56 107 82 55 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 28 56 107 82 55 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 105
Stack now 0 4 1 10 29 28 56 107 82 55 105
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 149
Stack now 0 4 1 10 29 28 56 107 82 55 105 149
Reducing stack by rule 76 (line 169):
$1 = token '(' ()
$2 = token tOBJECT ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66(" ")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 4 1 10 29 77 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 4 1 10 29 77 79 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 108("<")
Next token is token '<' ()
Shifting token '<' ()
Entering state 63
Stack now 0 4 1 10 29 77 79 44 82 63
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 82 63 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 82 63 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 114
Stack now 0 4 1 10 29 77 79 44 82 63 114
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 82 63 114 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 82 63 114 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 157
Stack now 0 4 1 10 29 77 79 44 82 63 114 157
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 192
Stack now 0 4 1 10 29 77 79 44 82 63 114 157 192
Reducing stack by rule 63 (line 156):
$1 = token '(' ()
$2 = token '<' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 4 1 10 29 77 79 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 4 1 10 29 77 79 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 77 79 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 98 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 98 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 79 44 91 79 52 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 77 79 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 29 77 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 29 77 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 4 1 10 29 77 79 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 4 1 10 29 77 79 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 4 1 10 29 77 79 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 4 1 10 29 77 79 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66(" ")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 4 1 10 29 77 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 4 1 10 29 77 79 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 108("<")
Next token is token '<' ()
Shifting token '<' ()
Entering state 63
Stack now 0 4 1 10 29 77 79 44 82 63
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 82 63 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 82 63 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 114
Stack now 0 4 1 10 29 77 79 44 82 63 114
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 82 63 114 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 82 63 114 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 157
Stack now 0 4 1 10 29 77 79 44 82 63 114 157
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 192
Stack now 0 4 1 10 29 77 79 44 82 63 114 157 192
Reducing stack by rule 63 (line 156):
$1 = token '(' ()
$2 = token '<' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 4 1 10 29 77 79 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 4 1 10 29 77 79 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 77 79 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 98 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 98 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 77 79 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 29 77 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 29 77 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 4 1 10 29 77 79 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 4 1 10 29 77 79 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 4 1 10 29 77 79 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 4 1 10 29 77 79 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 68("\n")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 4 1 10 29 77 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 4 1 10 29 77 79 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 108("<")
Next token is token '<' ()
Shifting token '<' ()
Entering state 63
Stack now 0 4 1 10 29 77 79 44 82 63
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 82 63 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 82 63 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 114
Stack now 0 4 1 10 29 77 79 44 82 63 114
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 82 63 114 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 82 63 114 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 157
Stack now 0 4 1 10 29 77 79 44 82 63 114 157
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 192
Stack now 0 4 1 10 29 77 79 44 82 63 114 157 192
Reducing stack by rule 63 (line 156):
$1 = token '(' ()
$2 = token '<' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 4 1 10 29 77 79 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 4 1 10 29 77 79 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 77 79 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 98 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 98 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 108("/")
Next token is token '/' ()
Shifting token '/' ()
Entering state 70
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 82 70
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("6")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 82 70 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 121
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 82 70 121
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 82 70 121 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 82 70 121 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 82 70 121 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 82 70 121 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 82 70 121 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 82 70 121 82 50 98 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 82 70 121 82 50 98 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 82 70 121 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 82 70 121 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 82 70 121 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 166
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 82 70 121 166
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 198
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 82 70 121 166 198
Reducing stack by rule 61 (line 154):
$1 = token '(' ()
$2 = token '/' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 79 44 91 79 52 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 77 79 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 29 77 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 29 77 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 4 1 10 29 77 79 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 4 1 10 29 77 79 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 4 1 10 29 77 79 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 4 1 10 29 77 79 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 64(""")
--(end of buffer or a NUL)
--accepting rule at line 66(" ")
--(end of buffer or a NUL)
--accepting rule at line 65(""")
Next token is token tSTRING ()
Shifting token tSTRING ()
Entering state 26
Stack now 0 4 1 10 29 77 79 47 26
Reducing stack by rule 54 (line 147):
$1 = token tSTRING ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 4 1 10 29 77 79 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 108("<")
Next token is token '<' ()
Shifting token '<' ()
Entering state 63
Stack now 0 4 1 10 29 77 79 44 82 63
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 82 63 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 82 63 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 114
Stack now 0 4 1 10 29 77 79 44 82 63 114
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 82 63 114 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 82 63 114 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 157
Stack now 0 4 1 10 29 77 79 44 82 63 114 157
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 192
Stack now 0 4 1 10 29 77 79 44 82 63 114 157 192
Reducing stack by rule 63 (line 156):
$1 = token '(' ()
$2 = token '<' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 4 1 10 29 77 79 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 4 1 10 29 77 79 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 77 79 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 98 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 98 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 77 79 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 29 77 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 29 77 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 4 1 10 29 77 79 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 4 1 10 29 77 79 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 4 1 10 29 77 79 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 4 1 10 29 77 79 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/P-03-105-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_P-03-105-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1,2 ****
- 2222
- 3333
--- 0 ----
output differs from expected
---------------------------P-04-106-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 1 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 1 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("d")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("4")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 29 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 29 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("j")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 29 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 29 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 29 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 1 10 29 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 35("objects")
Next token is token tOBJECT ()
Shifting token tOBJECT ()
Entering state 55
Stack now 0 4 1 10 29 28 56 107 82 55
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("7")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 28 56 107 82 55 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 105
Stack now 0 4 1 10 29 28 56 107 82 55 105
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 149
Stack now 0 4 1 10 29 28 56 107 82 55 105 149
Reducing stack by rule 76 (line 169):
$1 = token '(' ()
$2 = token tOBJECT ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 4 1 10 29 77 79 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 108("<")
Next token is token '<' ()
Shifting token '<' ()
Entering state 63
Stack now 0 4 1 10 29 77 79 44 82 63
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 82 63 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 82 63 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 114
Stack now 0 4 1 10 29 77 79 44 82 63 114
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("6")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 44 82 63 114 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 157
Stack now 0 4 1 10 29 77 79 44 82 63 114 157
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 192
Stack now 0 4 1 10 29 77 79 44 82 63 114 157 192
Reducing stack by rule 63 (line 156):
$1 = token '(' ()
$2 = token '<' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 4 1 10 29 77 79 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 4 1 10 29 77 79 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 77 79 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 98 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 98 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("d")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 79 44 91 79 52 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 77 79 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 29 77 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 29 77 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 4 1 10 29 77 79 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 4 1 10 29 77 79 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 4 1 10 29 77 79 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 4 1 10 29 77 79 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 98 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 98 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("*")
Next token is token '*' ()
Shifting token '*' ()
Entering state 69
Stack now 0 4 1 10 29 77 79 56 107 82 69
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("d")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 107 82 69 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 107 82 69 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 120
Stack now 0 4 1 10 29 77 79 56 107 82 69 120
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("d")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 107 82 69 120 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 107 82 69 120 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 165
Stack now 0 4 1 10 29 77 79 56 107 82 69 120 165
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 197
Stack now 0 4 1 10 29 77 79 56 107 82 69 120 165 197
Reducing stack by rule 60 (line 153):
$1 = token '(' ()
$2 = token '*' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 38("loop")
Next token is token tLOOP ()
Shifting token tLOOP ()
Entering state 44
Stack now 0 4 1 10 29 77 79 44
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 108("<")
Next token is token '<' ()
Shifting token '<' ()
Entering state 63
Stack now 0 4 1 10 29 77 79 44 82 63
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("j")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 82 63 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 82 63 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 114
Stack now 0 4 1 10 29 77 79 44 82 63 114
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("7")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 44 82 63 114 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 157
Stack now 0 4 1 10 29 77 79 44 82 63 114 157
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 192
Stack now 0 4 1 10 29 77 79 44 82 63 114 157 192
Reducing stack by rule 63 (line 156):
$1 = token '(' ()
$2 = token '<' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 91
Stack now 0 4 1 10 29 77 79 44 91
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79 44 91 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 50("block")
Next token is token tBLOCK ()
Shifting token tBLOCK ()
Entering state 52
Stack now 0 4 1 10 29 77 79 44 91 79 52
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 77 79 44 91 79 52 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("j")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 98 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 98 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 44 91 79 52 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 77 79 44 91 79 52 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 29 77 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("j")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("j")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 79 44 91 79 52 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 29 77 79 44 91 79 52 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 100
Stack now 0 4 1 10 29 77 79 44 91 79 52 100
Next token is token ')' ()
Shifting token ')' ()
Entering state 146
Stack now 0 4 1 10 29 77 79 44 91 79 52 100 146
Reducing stack by rule 47 (line 134):
$1 = token '(' ()
$2 = token tBLOCK ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 138
Stack now 0 4 1 10 29 77 79 44 91 138
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 177
Stack now 0 4 1 10 29 77 79 44 91 138 177
Reducing stack by rule 39 (line 126):
$1 = token '(' ()
$2 = token tLOOP ()
$3 = nterm expr ()
$4 = nterm stmt ()
$5 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/P-04-106-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_P-04-106-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
- 4444441.6E1
--- 0 ----
output differs from expected
---------------------------P-05-107-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 10 28 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 4 1 10 28 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 4 1 10 28 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 47("null")
Next token is token tNULL ()
Shifting token tNULL ()
Entering state 27
Stack now 0 4 1 10 28 18 42 27
Reducing stack by rule 55 (line 148):
$1 = token tNULL ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 35("objects")
Next token is token tOBJECT ()
Shifting token tOBJECT ()
Entering state 55
Stack now 0 4 1 10 29 28 56 107 82 55
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 28 56 107 82 55 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 105
Stack now 0 4 1 10 29 28 56 107 82 55 105
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 149
Stack now 0 4 1 10 29 28 56 107 82 55 105 149
Reducing stack by rule 76 (line 169):
$1 = token '(' ()
$2 = token tOBJECT ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("6")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 107 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 107 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 107 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 107 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 82 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 107 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 107 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 107 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/P-05-107-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_P-05-107-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
- 6
--- 0 ----
output differs from expected
---------------------------P-06-108-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 4 1 10 28 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 4 1 10 28 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 47("null")
Next token is token tNULL ()
Shifting token tNULL ()
Entering state 27
Stack now 0 4 1 10 28 18 42 27
Reducing stack by rule 55 (line 148):
$1 = token tNULL ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 29 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 29 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 4 1 10 29 28 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 4 1 10 29 28 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 29 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("q")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 29 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 47("null")
Next token is token tNULL ()
Shifting token tNULL ()
Entering state 27
Stack now 0 4 1 10 29 28 18 42 27
Reducing stack by rule 55 (line 148):
$1 = token tNULL ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 29 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 29 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 1 10 29 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 35("objects")
Next token is token tOBJECT ()
Shifting token tOBJECT ()
Entering state 55
Stack now 0 4 1 10 29 28 56 107 82 55
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 28 56 107 82 55 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 105
Stack now 0 4 1 10 29 28 56 107 82 55 105
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 149
Stack now 0 4 1 10 29 28 56 107 82 55 105 149
Reducing stack by rule 76 (line 169):
$1 = token '(' ()
$2 = token tOBJECT ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("q")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 35("objects")
Next token is token tOBJECT ()
Shifting token tOBJECT ()
Entering state 55
Stack now 0 4 1 10 29 77 79 56 107 82 55
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 82 55 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 105
Stack now 0 4 1 10 29 77 79 56 107 82 55 105
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 149
Stack now 0 4 1 10 29 77 79 56 107 82 55 105 149
Reducing stack by rule 76 (line 169):
$1 = token '(' ()
$2 = token tOBJECT ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("q")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("6")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 10 29 77 79 56 107 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 56 107 82 68 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 107 82 68 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 56 107 82 68 82 50 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 29 77 79 56 107 82 68 82 50 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("q")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 107 82 68 82 50 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 107 82 68 82 50 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 29 77 79 56 107 82 68 82 50 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 82 68 82 50 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 29 77 79 56 107 82 68 82 50 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 29 77 79 56 107 82 68 82 50 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 107 82 68 82 50 98
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 82 68 82 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 107 82 68 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 107 82 68 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 107 82 68 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 10 29 77 79 56 107 82 68 119
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 56 107 82 68 119 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 107 82 68 119 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 107 82 68 119 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 107 82 68 119 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 107 82 68 119 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 82 68 119 82 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 107 82 68 119 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 107 82 68 119 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 107 82 68 119 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 164
Stack now 0 4 1 10 29 77 79 56 107 82 68 119 164
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 196
Stack now 0 4 1 10 29 77 79 56 107 82 68 119 164 196
Reducing stack by rule 59 (line 152):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/P-06-108-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_P-06-108-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
- 3
--- 0 ----
output differs from expected
---------------------------P-07-109-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 1 12 37 82 51 99 145 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 1 12 37 82 51 99 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 1 12 37 82 51 99 145 181 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 1 12 37 82 51 99 145 181 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 12 37 82 51 99 145 184 204 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 12 37 82 51 99 145 184 204 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 12 37 82 51 99 145 184 204 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 12 37 82 51 99 145 184 204 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 184 204 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 12 37 82 51 99 145 184 204 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 4 1 10 28 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 4 1 10 28 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 47("null")
Next token is token tNULL ()
Shifting token tNULL ()
Entering state 27
Stack now 0 4 1 10 28 18 42 27
Reducing stack by rule 55 (line 148):
$1 = token tNULL ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 35("objects")
Next token is token tOBJECT ()
Shifting token tOBJECT ()
Entering state 55
Stack now 0 4 1 10 29 28 56 107 82 55
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 28 56 107 82 55 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 105
Stack now 0 4 1 10 29 28 56 107 82 55 105
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 149
Stack now 0 4 1 10 29 28 56 107 82 55 105 149
Reducing stack by rule 76 (line 169):
$1 = token '(' ()
$2 = token tOBJECT ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("100")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("40")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 29 77 79 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 29 77 79 76
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 76 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 76 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 77 79 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 29 77 79 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 47 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 47 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 47 82 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 47 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 47 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/P-07-109-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_P-07-109-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
- 1
--- 0 ----
output differs from expected
---------------------------Q-01-110-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 59("public")
Next token is token tPUBLIC ()
Shifting token tPUBLIC ()
Entering state 11
Stack now 0 1 11
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("main")
Next token is token tIDENTIFIER ()
Reducing stack by rule 6 (line 75):
$1 = token tPUBLIC ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 1 16
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 40
Stack now 0 1 16 40
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 16 40 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 16 40 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 16 40 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 16 40 82 51 99 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 16 40 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 1 16 40 82 51 99 145 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 1 16 40 82 51 99 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 16 40 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 16 40 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 16 40 82 51 99 145 181 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 16 40 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 1 16 40 82 51 99 145 181 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 1 16 40 82 51 99 145 181 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 16 40 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 16 40 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 16 40 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 16 40 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 16 40 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 16 40 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 16 40 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 16 40 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 16 40 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 67 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 67 118 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 67 118 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 16 40 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 16 40 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 16 40 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 16 40 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 16 40 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 87
Stack now 0 1 16 40 87
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 134
Stack now 0 1 16 40 87 134
Reducing stack by rule 16 (line 89):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 10 28 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 4 1 10 28 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 4 1 10 28 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 47("null")
Next token is token tNULL ()
Shifting token tNULL ()
Entering state 27
Stack now 0 4 1 10 28 18 42 27
Reducing stack by rule 55 (line 148):
$1 = token tNULL ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 10 29 28 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 29 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 4 1 10 29 28 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 4 1 10 29 28 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 29 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("q")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 29 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 47("null")
Next token is token tNULL ()
Shifting token tNULL ()
Entering state 27
Stack now 0 4 1 10 29 28 18 42 27
Reducing stack by rule 55 (line 148):
$1 = token tNULL ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 29 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 29 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 1 10 29 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 35("objects")
Next token is token tOBJECT ()
Shifting token tOBJECT ()
Entering state 55
Stack now 0 4 1 10 29 28 56 107 82 55
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 28 56 107 82 55 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 105
Stack now 0 4 1 10 29 28 56 107 82 55 105
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 149
Stack now 0 4 1 10 29 28 56 107 82 55 105 149
Reducing stack by rule 76 (line 169):
$1 = token '(' ()
$2 = token tOBJECT ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("3.1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 4 1 10 29 77 79 56 107 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("2.1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 4 1 10 29 77 79 56 107 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("6.1E1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 4 1 10 29 77 79 56 107 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("q")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("main")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 107 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 29 77 79 56 107 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 29 77 79 56 107 82 76
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 107 82 76 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 107 82 76 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 56 107 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 77 79 56 107 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 29 77 79 56 107 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 47 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("q")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 47 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 47 82 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 47 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 47 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/Q-01-110-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_Q-01-110-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
- 6.1E1
--- 0 ----
output differs from expected
---------------------------Q-02-111-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 59("public")
Next token is token tPUBLIC ()
Shifting token tPUBLIC ()
Entering state 11
Stack now 0 1 11
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("main")
Next token is token tIDENTIFIER ()
Reducing stack by rule 6 (line 75):
$1 = token tPUBLIC ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 1 16
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 40
Stack now 0 1 16 40
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 16 40 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 16 40 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 16 40 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 16 40 82 51 99 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 16 40 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 1 16 40 82 51 99 145 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 1 16 40 82 51 99 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 16 40 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 16 40 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 16 40 82 51 99 145 181 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 16 40 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 1 16 40 82 51 99 145 181 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 1 16 40 82 51 99 145 181 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 16 40 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 16 40 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 16 40 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 16 40 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 16 40 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 16 40 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 16 40 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 16 40 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 16 40 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 67 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 67 118 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 67 118 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 16 40 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 16 40 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 16 40 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 16 40 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 16 40 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 87
Stack now 0 1 16 40 87
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 134
Stack now 0 1 16 40 87 134
Reducing stack by rule 16 (line 89):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 10 28 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 4 1 10 28 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 4 1 10 28 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 47("null")
Next token is token tNULL ()
Shifting token tNULL ()
Entering state 27
Stack now 0 4 1 10 28 18 42 27
Reducing stack by rule 55 (line 148):
$1 = token tNULL ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 10 29 28 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 29 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 4 1 10 29 28 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 4 1 10 29 28 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 29 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("q")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 29 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 47("null")
Next token is token tNULL ()
Shifting token tNULL ()
Entering state 27
Stack now 0 4 1 10 29 28 18 42 27
Reducing stack by rule 55 (line 148):
$1 = token tNULL ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 29 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 29 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 1 10 29 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 35("objects")
Next token is token tOBJECT ()
Shifting token tOBJECT ()
Entering state 55
Stack now 0 4 1 10 29 28 56 107 82 55
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 28 56 107 82 55 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 105
Stack now 0 4 1 10 29 28 56 107 82 55 105
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 149
Stack now 0 4 1 10 29 28 56 107 82 55 105 149
Reducing stack by rule 76 (line 169):
$1 = token '(' ()
$2 = token tOBJECT ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("3.1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 4 1 10 29 77 79 56 107 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("2.1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 4 1 10 29 77 79 56 107 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("6.1E1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 4 1 10 29 77 79 56 107 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("q")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("main")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 107 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 29 77 79 56 107 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 29 77 79 56 107 82 76
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 56 107 82 76 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("main")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 107 82 76 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 29 77 79 56 107 82 76 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 29 77 79 56 107 82 76 82 76
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 107 82 76 82 76 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 107 82 76 82 76 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 56 107 82 76 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 77 79 56 107 82 76 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 29 77 79 56 107 82 76 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 56 107 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 77 79 56 107 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 29 77 79 56 107 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 47 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("q")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 47 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 47 82 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 47 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 47 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/Q-02-111-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_Q-02-111-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
- 6.1E1
--- 0 ----
output differs from expected
---------------------------Q-03-112-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("r")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("6.1E1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 1 18 42 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 10 28 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 4 1 10 28 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 4 1 10 28 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 47("null")
Next token is token tNULL ()
Shifting token tNULL ()
Entering state 27
Stack now 0 4 1 10 28 18 42 27
Reducing stack by rule 55 (line 148):
$1 = token tNULL ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("?")
Next token is token '?' ()
Shifting token '?' ()
Entering state 73
Stack now 0 4 1 10 29 28 56 107 82 73
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("r")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 56 107 82 73 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 123
Stack now 0 4 1 10 29 28 56 107 82 73 123
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 168
Stack now 0 4 1 10 29 28 56 107 82 73 123 168
Reducing stack by rule 72 (line 165):
$1 = token '(' ()
$2 = token '?' ()
$3 = nterm lval ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 47 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 47 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 47 82 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 47 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 47 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/Q-03-112-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_Q-03-112-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
- 6.1E1
--- 0 ----
output differs from expected
---------------------------Q-04-113-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 10 28 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("r")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("6.1E1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 1 10 28 18 42 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 10 29 28 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 29 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 1 10 29 28 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 1 10 29 28 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 29 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 29 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 47("null")
Next token is token tNULL ()
Shifting token tNULL ()
Entering state 27
Stack now 0 1 10 29 28 18 42 27
Reducing stack by rule 55 (line 148):
$1 = token tNULL ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 10 29 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 10 29 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 1 10 29 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("?")
Next token is token '?' ()
Shifting token '?' ()
Entering state 73
Stack now 0 1 10 29 28 56 107 82 73
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("r")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 56 107 82 73 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 123
Stack now 0 1 10 29 28 56 107 82 73 123
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 168
Stack now 0 1 10 29 28 56 107 82 73 123 168
Reducing stack by rule 72 (line 165):
$1 = token '(' ()
$2 = token '?' ()
$3 = nterm lval ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 1 10 29 77 79 47 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 77 79 47 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 77 79 47 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 1 10 29 77 79 47 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 47 82 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 1 10 29 77 79 47 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 1 10 29 77 79 47 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 77 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/Q-04-113-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_Q-04-113-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
- 6.1E1
--- 0 ----
output differs from expected
---------------------------Q-05-114-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("r")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("6.1E1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 1 18 42 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 59("public")
Next token is token tPUBLIC ()
Shifting token tPUBLIC ()
Entering state 11
Stack now 0 4 1 11
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("main")
Next token is token tIDENTIFIER ()
Reducing stack by rule 6 (line 75):
$1 = token tPUBLIC ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 4 1 16
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 40
Stack now 0 4 1 16 40
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 16 40 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 16 40 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 16 40 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 16 40 82 51 99 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 16 40 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 16 40 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 16 40 82 51 99 145 181 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 16 40 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 4 1 16 40 82 51 99 145 181 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 4 1 16 40 82 51 99 145 181 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 16 40 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 16 40 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 16 40 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 16 40 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 16 40 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 16 40 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 16 40 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 16 40 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 49 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 49 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 49 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 49 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 49 82 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 49 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 49 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 49 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 16 40 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 16 40 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 16 40 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 16 40 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 16 40 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 16 40 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 87
Stack now 0 4 1 16 40 87
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 134
Stack now 0 4 1 16 40 87 134
Reducing stack by rule 16 (line 89):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("main")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82 76 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("?")
Next token is token '?' ()
Shifting token '?' ()
Entering state 73
Stack now 0 4 1 10 28 47 82 76 82 73
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("r")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 76 82 73 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 123
Stack now 0 4 1 10 28 47 82 76 82 73 123
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 168
Stack now 0 4 1 10 28 47 82 76 82 73 123 168
Reducing stack by rule 72 (line 165):
$1 = token '(' ()
$2 = token '?' ()
$3 = nterm lval ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/Q-05-114-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_Q-05-114-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
! 6.1E1
--- 1 ----
! 0
output differs from expected
---------------------------Q-06-115-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 59("public")
Next token is token tPUBLIC ()
Shifting token tPUBLIC ()
Entering state 11
Stack now 0 1 11
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("main")
Next token is token tIDENTIFIER ()
Reducing stack by rule 6 (line 75):
$1 = token tPUBLIC ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 1 16
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 40
Stack now 0 1 16 40
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 16 40 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 16 40 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 16 40 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 16 40 82 51 99 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 16 40 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 16 40 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 16 40 82 51 99 145 181 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 16 40 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 1 16 40 82 51 99 145 181 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 1 16 40 82 51 99 145 181 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 16 40 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 16 40 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 16 40 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 16 40 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 16 40 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 16 40 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 16 40 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 16 40 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 16 40 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 16 40 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 16 40 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 16 40 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 16 40 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 16 40 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 87
Stack now 0 1 16 40 87
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 134
Stack now 0 1 16 40 87 134
Reducing stack by rule 16 (line 89):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 10 28 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("r")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("6.1E1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 4 1 10 28 18 42 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("main")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 29 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 29 28 47 82 76
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 28 47 82 76 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("?")
Next token is token '?' ()
Shifting token '?' ()
Entering state 73
Stack now 0 4 1 10 29 28 47 82 76 82 73
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("r")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 47 82 76 82 73 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 123
Stack now 0 4 1 10 29 28 47 82 76 82 73 123
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 168
Stack now 0 4 1 10 29 28 47 82 76 82 73 123 168
Reducing stack by rule 72 (line 165):
$1 = token '(' ()
$2 = token '?' ()
$3 = nterm lval ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 28 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 29 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/Q-06-115-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_Q-06-115-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
! 6.1E1
--- 1 ----
! 0
output differs from expected
---------------------------Q-07-116-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 59("public")
Next token is token tPUBLIC ()
Shifting token tPUBLIC ()
Entering state 11
Stack now 0 1 11
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("main")
Next token is token tIDENTIFIER ()
Reducing stack by rule 6 (line 75):
$1 = token tPUBLIC ()
-> $$ = nterm qualifier ()
Entering state 16
Stack now 0 1 16
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 40
Stack now 0 1 16 40
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 16 40 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 16 40 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 16 40 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 16 40 82 51 99 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 16 40 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 16 40 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 16 40 82 51 99 145 181 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 16 40 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 1 16 40 82 51 99 145 181 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 1 16 40 82 51 99 145 181 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 16 40 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 16 40 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 16 40 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 16 40 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 16 40 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 16 40 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 16 40 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 16 40 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 16 40 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 82 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 16 40 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 16 40 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 16 40 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 16 40 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 16 40 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 16 40 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 87
Stack now 0 1 16 40 87
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 134
Stack now 0 1 16 40 87 134
Reducing stack by rule 16 (line 89):
$1 = token '(' ()
$2 = nterm qualifier ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 10 28 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("!")
Next token is token '!' ()
Shifting token '!' ()
Entering state 43
Stack now 0 4 1 10 28 18 43
Reducing stack by rule 29 (line 110):
$1 = nterm type ()
$2 = token '!' ()
-> $$ = nterm pointer ()
Entering state 19
Stack now 0 4 1 10 28 19
Reducing stack by rule 27 (line 106):
$1 = nterm pointer ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 47("null")
Next token is token tNULL ()
Shifting token tNULL ()
Entering state 27
Stack now 0 4 1 10 28 18 42 27
Reducing stack by rule 55 (line 148):
$1 = token tNULL ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 35("objects")
Next token is token tOBJECT ()
Shifting token tOBJECT ()
Entering state 55
Stack now 0 4 1 10 29 28 56 107 82 55
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 28 56 107 82 55 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 105
Stack now 0 4 1 10 29 28 56 107 82 55 105
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 149
Stack now 0 4 1 10 29 28 56 107 82 55 105 149
Reducing stack by rule 76 (line 169):
$1 = token '(' ()
$2 = token tOBJECT ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("3.1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 4 1 10 29 77 79 56 107 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("2.1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 4 1 10 29 77 79 56 107 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 56 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 56 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 56 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 56 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 56 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("6.1E1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 4 1 10 29 77 79 56 107 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("main")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 29 77 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 29 77 79 47 82 76
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82 76 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("?")
Next token is token '?' ()
Shifting token '?' ()
Entering state 73
Stack now 0 4 1 10 29 77 79 47 82 76 82 73
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 106
Stack now 0 4 1 10 29 77 79 47 82 76 82 73 106
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 54("index")
Next token is token tINDEX ()
Shifting token tINDEX ()
Entering state 50
Stack now 0 4 1 10 29 77 79 47 82 76 82 73 106 50
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("p")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 82 76 82 73 106 50 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 82 76 82 73 106 50 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 98
Stack now 0 4 1 10 29 77 79 47 82 76 82 73 106 50 98
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 47 82 76 82 73 106 50 98 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 144
Stack now 0 4 1 10 29 77 79 47 82 76 82 73 106 50 98 144
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 180
Stack now 0 4 1 10 29 77 79 47 82 76 82 73 106 50 98 144 180
Reducing stack by rule 49 (line 138):
$1 = token '(' ()
$2 = token tINDEX ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm lval ()
Entering state 123
Stack now 0 4 1 10 29 77 79 47 82 76 82 73 123
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 168
Stack now 0 4 1 10 29 77 79 47 82 76 82 73 123 168
Reducing stack by rule 72 (line 165):
$1 = token '(' ()
$2 = token '?' ()
$3 = nterm lval ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 77 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 29 77 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/Q-07-116-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_Q-07-116-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
- 6.1E1
--- 0 ----
output differs from expected
---------------------------R-01-117-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("z")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("30")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 4 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 4 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 12 37 82 51 99 145
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 182
Stack now 0 4 1 12 37 82 51 99 145 182
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 182 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 12 37 82 51 99 145 182 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("z")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 182 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 12 37 82 51 99 145 182 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("7")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 12 37 82 51 99 145 182 28 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 12 37 82 51 99 145 182 28 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 12 37 82 51 99 145 182 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 12 37 82 51 99 145 182 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 12 37 82 51 99 145 182 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 182 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 12 37 82 51 99 145 182 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 12 37 82 51 99 145 182 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("z")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 182 31 79 49 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 182 31 79 49 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 12 37 82 51 99 145 182 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 12 37 82 51 99 145 182 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 12 37 82 51 99 145 182 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 182 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 203
Stack now 0 4 1 12 37 82 51 99 145 182 203
Next token is token ')' ()
Shifting token ')' ()
Entering state 206
Stack now 0 4 1 12 37 82 51 99 145 182 203 206
Reducing stack by rule 85 (line 180):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = token ')' ()
$6 = nterm block ()
$7 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 4 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 4 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 32("&&")
Next token is token tAND ()
Shifting token tAND ()
Entering state 65
Stack now 0 4 1 10 28 65
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 65 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 4 1 10 28 65 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 65 82 60 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 65 82 60 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 4 1 10 28 65 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 65 82 60 111 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 65 82 60 111 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 4 1 10 28 65 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 4 1 10 28 65 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 116
Stack now 0 4 1 10 28 65 116
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 65 116 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 65 116 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 65 116 82 75
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 65 116 82 76
Next token is token ')' ()
Shifting token ')' ()
Entering state 127
Stack now 0 4 1 10 28 65 116 82 76 127
Reducing stack by rule 78 (line 171):
$1 = token '(' ()
$2 = nterm expr ()
$3 = token ')' ()
-> $$ = nterm expr ()
Entering state 159
Stack now 0 4 1 10 28 65 116 159
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 193
Stack now 0 4 1 10 28 65 116 159 193
Reducing stack by rule 70 (line 163):
$1 = token '(' ()
$2 = token tAND ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("z")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/R-01-117-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_R-01-117-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
- 30
--- 0 ----
output differs from expected
---------------------------R-02-118-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("10")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("z")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 86("30")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 4 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 4 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 12 37 82 51 99 145
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 182
Stack now 0 4 1 12 37 82 51 99 145 182
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 182 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 12 37 82 51 99 145 182 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("z")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 182 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 12 37 82 51 99 145 182 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("7")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 12 37 82 51 99 145 182 28 56 107 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 12 37 82 51 99 145 182 28 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 12 37 82 51 99 145 182 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 12 37 82 51 99 145 182 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 12 37 82 51 99 145 182 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 182 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 12 37 82 51 99 145 182 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 12 37 82 51 99 145 182 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("z")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 182 31 79 49 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 182 31 79 49 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 12 37 82 51 99 145 182 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 12 37 82 51 99 145 182 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 12 37 82 51 99 145 182 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 182 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 203
Stack now 0 4 1 12 37 82 51 99 145 182 203
Next token is token ')' ()
Shifting token ')' ()
Entering state 206
Stack now 0 4 1 12 37 82 51 99 145 182 203 206
Reducing stack by rule 85 (line 180):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = token ')' ()
$6 = nterm block ()
$7 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 4 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 4 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 33("||")
Next token is token tOR ()
Shifting token tOR ()
Entering state 66
Stack now 0 4 1 10 28 66
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 66 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("~")
Next token is token '~' ()
Shifting token '~' ()
Entering state 64
Stack now 0 4 1 10 28 66 82 64
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 66 82 64 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 30("==")
Next token is token tEQ ()
Shifting token tEQ ()
Entering state 60
Stack now 0 4 1 10 28 66 82 64 82 60
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 66 82 64 82 60 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 66 82 64 82 60 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 111
Stack now 0 4 1 10 28 66 82 64 82 60 111
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("y")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 66 82 64 82 60 111 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 66 82 64 82 60 111 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 154
Stack now 0 4 1 10 28 66 82 64 82 60 111 154
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 189
Stack now 0 4 1 10 28 66 82 64 82 60 111 154 189
Reducing stack by rule 68 (line 161):
$1 = token '(' ()
$2 = token tEQ ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 115
Stack now 0 4 1 10 28 66 82 64 115
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 158
Stack now 0 4 1 10 28 66 82 64 115 158
Reducing stack by rule 74 (line 167):
$1 = token '(' ()
$2 = token '~' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 117
Stack now 0 4 1 10 28 66 117
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 66 117 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 66 117 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 66 117 82 75
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 66 117 82 76
Next token is token ')' ()
Shifting token ')' ()
Entering state 127
Stack now 0 4 1 10 28 66 117 82 76 127
Reducing stack by rule 78 (line 171):
$1 = token '(' ()
$2 = nterm expr ()
$3 = token ')' ()
-> $$ = nterm expr ()
Entering state 160
Stack now 0 4 1 10 28 66 117 160
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 194
Stack now 0 4 1 10 28 66 117 160 194
Reducing stack by rule 69 (line 162):
$1 = token '(' ()
$2 = token tOR ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("z")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/R-02-118-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_R-02-118-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
- 30
--- 0 ----
output differs from expected
---------------------------S-01-119-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 1 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 46("void")
Next token is token tVOID_TYPE ()
Shifting token tVOID_TYPE ()
Entering state 9
Stack now 0 1 15 9
Reducing stack by rule 26 (line 105):
$1 = token tVOID_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 15 39
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 86
Stack now 0 1 15 39 86
Reducing stack by rule 19 (line 94):
$1 = token '(' ()
$2 = nterm type ()
$3 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 10 28 56 107 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 10 28 56 107 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 46("void")
Next token is token tVOID_TYPE ()
Shifting token tVOID_TYPE ()
Entering state 9
Stack now 0 4 1 10 28 56 107 82 51 99 9
Reducing stack by rule 26 (line 105):
$1 = token tVOID_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 10 28 56 107 82 51 99 145
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 182
Stack now 0 4 1 10 28 56 107 82 51 99 145 182
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 29 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 29 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 29 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 29 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 29 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 29 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 29 77
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 203
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 203
Next token is token ')' ()
Shifting token ')' ()
Entering state 206
Stack now 0 4 1 10 28 56 107 82 51 99 145 182 203 206
Reducing stack by rule 85 (line 180):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = token ')' ()
$6 = nterm block ()
$7 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 10 28 56 107 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 31 79 75
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 31 79 76
Next token is token ')' ()
Shifting token ')' ()
Entering state 127
Stack now 0 4 1 10 31 79 76 127
Reducing stack by rule 78 (line 171):
$1 = token '(' ()
$2 = nterm expr ()
$3 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 31 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/S-01-119-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_S-01-119-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
- 3
--- 0 ----
output differs from expected
---------------------------S-01-120-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 72
Stack now 0 1 10 28 72
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 46("void")
Next token is token tVOID_TYPE ()
Shifting token tVOID_TYPE ()
Entering state 9
Stack now 0 1 10 28 72 9
Reducing stack by rule 26 (line 105):
$1 = token tVOID_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 10 28 72 39
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 86
Stack now 0 1 10 28 72 39 86
Reducing stack by rule 19 (line 94):
$1 = token '(' ()
$2 = nterm type ()
$3 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 10 28 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 28 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 10 28 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 10 29 28 56 107 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 10 29 28 56 107 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 46("void")
Next token is token tVOID_TYPE ()
Shifting token tVOID_TYPE ()
Entering state 9
Stack now 0 1 10 29 28 56 107 82 51 99 9
Reducing stack by rule 26 (line 105):
$1 = token tVOID_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 10 29 28 56 107 82 51 99 145
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 182
Stack now 0 1 10 29 28 56 107 82 51 99 145 182
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 28 18 42 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 29 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("x")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 29 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 29 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 29 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 29 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 29 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 29 77
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 203
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 203
Next token is token ')' ()
Shifting token ')' ()
Entering state 206
Stack now 0 1 10 29 28 56 107 82 51 99 145 182 203 206
Reducing stack by rule 85 (line 180):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = token ')' ()
$6 = nterm block ()
$7 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 10 29 28 56 107 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 77 79 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 1 10 29 77 79 75
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 1 10 29 77 79 76
Next token is token ')' ()
Shifting token ')' ()
Entering state 127
Stack now 0 1 10 29 77 79 76 127
Reducing stack by rule 78 (line 171):
$1 = token '(' ()
$2 = nterm expr ()
$3 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/S-01-120-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_S-01-120-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
- 3
--- 0 ----
output differs from expected
---------------------------U-01-121-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 4 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 4 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 12 37 82 51 99 145 184 181
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 4 1 12 37 82 51 99 145 184 181 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 4 1 12 37 82 51 99 145 184 181 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 184 181 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("fun")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 184 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 12 37 82 51 99 145 184 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 12 37 82 51 99 145 184 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 205
Stack now 0 4 1 12 37 82 51 99 145 184 205
Reducing stack by rule 87 (line 184):
$1 = nterm functionArgs ()
$2 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("fun")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 4 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 4 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 76 128 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 76 128 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 4 1 10 28 47 82 76 128 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve 4
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 31 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 31 79 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 128 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 10 31 79 47 82 76 128 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("*")
Next token is token '*' ()
Shifting token '*' ()
Entering state 69
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 120
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 165
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 165
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 197
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 165 197
Reducing stack by rule 60 (line 153):
$1 = token '(' ()
$2 = token '*' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 10 31 79 47 82 76 128 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 4 1 10 31 79 47 82 76 128 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 31 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve 6
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: execution failed
*** expected/U-01-121-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_U-01-121-N-ok.out Thu May 23 20:36:07 2024
----- ZONE 1 ----
*** 1 ****
! 46
--- 1,2 ----
! 0
! 134516861
output differs from expected
---------------------------U-02-122-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 4 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 4 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 12 37 82 51 99 145 184 181
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 4 1 12 37 82 51 99 145 184 181 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 4 1 12 37 82 51 99 145 184 181 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 184 181 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("fun")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 184 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 12 37 82 51 99 145 184 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 12 37 82 51 99 145 184 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 205
Stack now 0 4 1 12 37 82 51 99 145 184 205
Reducing stack by rule 87 (line 184):
$1 = nterm functionArgs ()
$2 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("fun")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 4 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 4 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 76 128 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 76 128 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 4 1 10 28 47 82 76 128 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve 4
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 31 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 31 79 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 128 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 10 31 79 47 82 76 128 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("*")
Next token is token '*' ()
Shifting token '*' ()
Entering state 69
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 120
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 165
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 165
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 197
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 165 197
Reducing stack by rule 60 (line 153):
$1 = token '(' ()
$2 = token '*' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 10 31 79 47 82 76 128 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 4 1 10 31 79 47 82 76 128 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 31 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve 6
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 31 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 31 79 47 82 76
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 82 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 10 31 79 47 82 76 82 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("7")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 82 67 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 82 67 118 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 82 67 118 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 10 31 79 47 82 76 82 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 31 79 47 82 76 82 76
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("8")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 82 76 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 31 79 47 82 76 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 128 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 10 31 79 47 82 76 128 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("*")
Next token is token '*' ()
Shifting token '*' ()
Entering state 69
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 120
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 165
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 165
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 197
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 165 197
Reducing stack by rule 60 (line 153):
$1 = token '(' ()
$2 = token '*' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 10 31 79 47 82 76 128 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 4 1 10 31 79 47 82 76 128 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 31 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve 30
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: execution failed
*** expected/U-02-122-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_U-02-122-N-ok.out Thu May 23 20:36:09 2024
----- ZONE 1 ----
*** 1 ****
! 4630
--- 1,1048565 ----
! 0
! 134516877
! 1
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
output differs from expected
---------------------------U-03-123-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 4 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 4 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 12 37 82 51 99 145 184 181
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 4 1 12 37 82 51 99 145 184 181 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 4 1 12 37 82 51 99 145 184 181 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 184 181 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("fun")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 184 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 12 37 82 51 99 145 184 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 12 37 82 51 99 145 184 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 205
Stack now 0 4 1 12 37 82 51 99 145 184 205
Reducing stack by rule 87 (line 184):
$1 = nterm functionArgs ()
$2 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("fun")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 4 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 4 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 4 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("h")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 4 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 12 37 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 12 37 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 12 37 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 12 37 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 12 37 82 51 99 145 184 181
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 4 1 12 37 82 51 99 145 184 181 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 4 1 12 37 82 51 99 145 184 181 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 184 181 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f1")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 184 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 12 37 82 51 99 145 184 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 12 37 82 51 99 145 184 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 205
Stack now 0 4 1 12 37 82 51 99 145 184 205
Reducing stack by rule 87 (line 184):
$1 = nterm functionArgs ()
$2 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 12 37 82 51 99 145 184 181
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 4 1 12 37 82 51 99 145 184 181 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 4 1 12 37 82 51 99 145 184 181 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 4 1 12 37 82 51 99 145 184 181 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 12 37 82 51 99 145 184 181 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f2")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 12 37 82 51 99 145 184 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 12 37 82 51 99 145 184 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 12 37 82 51 99 145 184 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 205
Stack now 0 4 1 12 37 82 51 99 145 184 205
Reducing stack by rule 87 (line 184):
$1 = nterm functionArgs ()
$2 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 12 37 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 12 37 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 12 37 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f1")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f2")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 82 76
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 82 76 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 82 76 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 12 37 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 12 37 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 12 37 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 12 37 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 12 37 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 4 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 4 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 47 82 76 128 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 47 82 76 128 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 4 1 10 28 47 82 76 128 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 28 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve 4
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 31 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 31 79 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 128 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 10 31 79 47 82 76 128 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("*")
Next token is token '*' ()
Shifting token '*' ()
Entering state 69
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 120
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 165
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 165
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 197
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 165 197
Reducing stack by rule 60 (line 153):
$1 = token '(' ()
$2 = token '*' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 10 31 79 47 82 76 128 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 4 1 10 31 79 47 82 76 128 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 31 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve 6
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 31 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 31 79 47 82 76
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 82 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 10 31 79 47 82 76 82 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("7")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 82 67 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 82 67 118 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 82 67 118 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 10 31 79 47 82 76 82 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 10 31 79 47 82 76 82 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 31 79 47 82 76 82 76
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("8")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 82 76 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 31 79 47 82 76 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 128 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 10 31 79 47 82 76 128 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("*")
Next token is token '*' ()
Shifting token '*' ()
Entering state 69
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 120
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 165
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 165
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 197
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 165 197
Reducing stack by rule 60 (line 153):
$1 = token '(' ()
$2 = token '*' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 10 31 79 47 82 76 128 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 4 1 10 31 79 47 82 76 128 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 31 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve 30
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 31 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("h")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 31 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("3")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 31 79 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 128 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 10 31 79 47 82 76 128 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("4")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 10 31 79 47 82 76 128 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 4 1 10 31 79 47 82 76 128 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 128 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 10 31 79 47 82 76 128 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("*")
Next token is token '*' ()
Shifting token '*' ()
Entering state 69
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("7")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 120
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("n")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 165
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 165
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 197
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 82 69 120 165 197
Reducing stack by rule 60 (line 153):
$1 = token '(' ()
$2 = token '*' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 10 31 79 47 82 76 128 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 10 31 79 47 82 76 128 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 4 1 10 31 79 47 82 76 128 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 31 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 31 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 31 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 31 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 31 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve 25
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: execution failed
*** expected/U-03-123-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_U-03-123-N-ok.out Thu May 23 20:36:10 2024
----- ZONE 1 ----
*** 1 ****
! 463025
--- 1,4 ----
! 0
! 134516877
! 1
! -1587292
output differs from expected
---------------------------X-01-124-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 1 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 15 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 1 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 15 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 1 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 1 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 1 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 1 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 18 42 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 18 42 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 18 42 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 18 42 82 51 99 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 18 42 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 18 42 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 18 42 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18 42 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 18 42 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 18 42 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 18 42 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 18 42 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 18 42 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 18 42 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("1.1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 82 67 118 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 18 42 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 18 42 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 18 42 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 18 42 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 18 42 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 4 1 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 15 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 4 1 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 4 1 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 15 39 85 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 4 1 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 4 1 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 4 1 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 4 1 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 18 42 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 18 42 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 18 42 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 18 42 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 18 42 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 18 42 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 18 42 82 51 99 145 181 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18 42 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("d")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 18 42 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 18 42 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 18 42 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 18 42 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 18 42 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 18 42 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 68 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 68 119
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 163
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 68 119 163
Reducing stack by rule 56 (line 149):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 18 42 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 18 42 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 18 42 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 18 42 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 18 42 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 4 1 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 15 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 4 1 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 4 1 15 39 85
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 4 1 15 39 85 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 15 39 85 15 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 4 1 15 39 85 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 4 1 15 39 85 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 15 39 85 15 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 4 1 15 39 85 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 15 39 85 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 4 1 15 39 85 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 4 1 15 39 85 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 4 1 15 39 85 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 4 1 15 39 85 133
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 15 39 85 132
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 15 39 85 132 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 175
Stack now 0 4 1 15 39 85 132 175
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 22 (line 99):
$1 = nterm types ()
$2 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 4 1 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 4 1 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 4 1 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("h")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 18 42 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 18 42 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 18 42 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 18 42 82 51 99 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 18 42 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 18 42 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 4 1 18 42 82 51 99 145 181 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 18 42 82 51 99 145 181 15 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 4 1 18 42 82 51 99 145 181 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 4 1 18 42 82 51 99 145 181 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 18 42 82 51 99 145 181 15 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 4 1 18 42 82 51 99 145 181 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 18 42 82 51 99 145 181 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 4 1 18 42 82 51 99 145 181 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 4 1 18 42 82 51 99 145 181 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 4 1 18 42 82 51 99 145 181 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18 42 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 18 42 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 18 42 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 18 42 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 18 42 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 18 42 82 51 99 145 184 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 18 42 82 51 99 145 184 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18 42 82 51 99 145 184 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42 82 51 99 145 184 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 18 42 82 51 99 145 184 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 18 42 82 51 99 145 184 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 205
Stack now 0 4 1 18 42 82 51 99 145 184 205
Reducing stack by rule 87 (line 184):
$1 = nterm functionArgs ()
$2 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 18 42 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 18 42 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 18 42 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 76
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 76 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 76 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 18 42 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 18 42 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 18 42 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 18 42 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 18 42 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 72
Stack now 0 4 1 10 28 72
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 10 28 72 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 4 1 10 28 72 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 4 1 10 28 72 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 28 72 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 4 1 10 28 72 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 10 28 72 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 4 1 10 28 72 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 4 1 10 28 72 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 4 1 10 28 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("ff")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 18 42 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 28 18 42 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 28 18 42 90
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 29 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 29 28 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 28 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 28 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 29 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve 1.1
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 107 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 56 107 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 29 77 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 29 77 79 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 77 79 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 29 77 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve -1
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("ff")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 29 77 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 29 77 79 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 77 79 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 29 77 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve -1
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("h")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 29 77 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 29 77 79 47 82 76
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 82 76 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 10 29 77 79 47 82 76 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 77 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 47 82 76 128 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 4 1 10 29 77 79 47 82 76 128 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 77 79 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 29 77 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve -1
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
7: undeclared variable 'g'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: execution failed
*** expected/X-01-124-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_X-01-124-N-ok.out Thu May 23 20:36:10 2024
----- ZONE 1 ----
*** 1 ****
! 1.1-1-1-1
--- 1,4 ----
! 0
! 134516877
! 1
! -7539484
output differs from expected
---------------------------X-02-125-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 1 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 15 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 1 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 15 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 1 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 1 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 1 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 1 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 18 42 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 18 42 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 18 42 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 1 18 42 82 51 99 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 18 42 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 18 42 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 18 42 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 18 42 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 18 42 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 18 42 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 18 42 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 18 42 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 18 42 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 18 42 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 18 42 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 18 42 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 95("1.1")
Next token is token tDOUBLE ()
Shifting token tDOUBLE ()
Entering state 24
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 82 67 118 24
Reducing stack by rule 53 (line 146):
$1 = token tDOUBLE ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 18 42 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 18 42 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 18 42 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 18 42 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 18 42 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 18 42 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 18 42 90
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 4 1 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 15 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 4 1 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 4 1 15 39 85
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 4 1 15 39 85 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 15 39 85 15 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 4 1 15 39 85 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 4 1 15 39 85 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 15 39 85 15 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 4 1 15 39 85 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 15 39 85 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 4 1 15 39 85 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 4 1 15 39 85 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 4 1 15 39 85 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 4 1 15 39 85 133
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 15 39 85 132
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 15 39 85 132 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 175
Stack now 0 4 1 15 39 85 132 175
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 22 (line 99):
$1 = nterm types ()
$2 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 4 1 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 4 1 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 4 1 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 18 42 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 18 42 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 18 42 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 18 42 82 51 99 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 18 42 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 18 42 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 4 1 18 42 82 51 99 145 181 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 18 42 82 51 99 145 181 15 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 4 1 18 42 82 51 99 145 181 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 4 1 18 42 82 51 99 145 181 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 18 42 82 51 99 145 181 15 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 4 1 18 42 82 51 99 145 181 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 18 42 82 51 99 145 181 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 4 1 18 42 82 51 99 145 181 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 4 1 18 42 82 51 99 145 181 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 4 1 18 42 82 51 99 145 181 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18 42 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 18 42 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 18 42 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 18 42 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 18 42 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 18 42 82 51 99 145 184 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 18 42 82 51 99 145 184 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 18 42 82 51 99 145 184 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 18 42 82 51 99 145 184 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 18 42 82 51 99 145 184 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 18 42 82 51 99 145 184 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 205
Stack now 0 4 1 18 42 82 51 99 145 184 205
Reducing stack by rule 87 (line 184):
$1 = nterm functionArgs ()
$2 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 18 42 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 18 42 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 18 42 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 76
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 76 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 76 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 18 42 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 18 42 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 18 42 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 18 42 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 18 42 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 18 42 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 18 42 90
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 4 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 72
Stack now 0 4 1 10 28 72
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 10 28 72 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 4 1 10 28 72 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 4 1 10 28 72 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 28 72 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 4 1 10 28 72 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 10 28 72 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 4 1 10 28 72 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 4 1 10 28 72 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 4 1 10 28 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("ff")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 18 42 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 10 28 18 42 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 10 28 18 42 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 28 18 42 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 10 28 18 42 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 10 28 18 42 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 10 28 18 42 82 51 99 145 181 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18 42 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("d")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 28 18 42 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 10 28 18 42 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 10 28 18 42 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 10 28 18 42 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 10 28 18 42 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 10 28 18 42 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28 18 42 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 28 18 42 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 28 18 42 82 51 99 145 184 204 28 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 28 18 42 82 51 99 145 184 204 28 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 28 18 42 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 28 18 42 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 28 18 42 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 10 28 18 42 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 10 28 18 42 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 10 28 18 42 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 28 18 42 90
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 29 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 29 28 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 28 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 28 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 29 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve 1.1
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 4 1 10 29 77 79 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 4 1 10 29 77 79 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 10 29 77 79 56 107 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 10 29 77 79 56 107 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 181 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("d")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 184 204 28 49 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 184 204 28 49 82 68 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 184 204 28 49 82 68 119
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 163
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 184 204 28 49 82 68 119 163
Reducing stack by rule 56 (line 149):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 10 29 77 79 56 107 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 10 29 77 79 56 107 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 4 1 10 29 77 79 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 4 1 10 29 77 79 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 4 1 10 29 77 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 29 77 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 29 77 79 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 77 79 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 29 77 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve -1
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("ff")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 29 77 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 29 77 79 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 77 79 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 29 77 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve 2
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 77 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 29 77 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 29 77 79 47 82 76
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82 76 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 4 1 10 29 77 79 47 82 76 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 44("double")
Next token is token tDOUBLE_TYPE ()
Shifting token tDOUBLE_TYPE ()
Entering state 7
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 181 7
Reducing stack by rule 24 (line 103):
$1 = token tDOUBLE_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("d")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("-")
Next token is token '-' ()
Shifting token '-' ()
Entering state 68
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 184 204 28 49 82 68
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 184 204 28 49 82 68 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 119
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 184 204 28 49 82 68 119
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 163
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 184 204 28 49 82 68 119 163
Reducing stack by rule 56 (line 149):
$1 = token '(' ()
$2 = token '-' ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 4 1 10 29 77 79 47 82 76 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 4 1 10 29 77 79 47 82 76 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 77 79 47 82 76 128
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 47 82 76 128 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 4 1 10 29 77 79 47 82 76 128 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 77 79 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 29 77 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 20("; escreve -2
")
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: X-02-125-N-ok.asm:8: error: undefined symbol `printi' (first use)
X-02-125-N-ok.asm:8: error: (Each undefined symbol is reported only once.)
X-02-125-N-ok.asm:10: error: undefined symbol `println' (first use)
'yasm' failed
---------------------------Z-01-126-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 60("var")
Next token is token tVAR ()
Shifting token tVAR ()
Entering state 12
Stack now 0 1 12
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 37
Stack now 0 1 12 37
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 15
Stack now 0 1 12 37 82 51 99 15
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 15 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 12 37 82 51 99 15 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 1 12 37 82 51 99 15 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 15 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 1 12 37 82 51 99 15 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 1 12 37 82 51 99 15 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 1 12 37 82 51 99 15 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 1 12 37 82 51 99 15 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 12 37 82 51 99 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 182
Stack now 0 1 12 37 82 51 99 145 182
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 182 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 182 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 182 28 49 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204 28 49 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204 28 49 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204 28 49 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 12 37 82 51 99 145 182 28 49 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 82 51 99 145 182 28 49 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 12 37 82 51 99 145 182 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 12 37 82 51 99 145 182 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 12 37 82 51 99 145 182 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 12 37 82 51 99 145 182 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 203
Stack now 0 1 12 37 82 51 99 145 182 203
Next token is token ')' ()
Shifting token ')' ()
Entering state 206
Stack now 0 1 12 37 82 51 99 145 182 203 206
Reducing stack by rule 85 (line 180):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = token ')' ()
$6 = nterm block ()
$7 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 12 37 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 83
Stack now 0 1 12 37 83
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 130
Stack now 0 1 12 37 83 130
Reducing stack by rule 18 (line 91):
$1 = token '(' ()
$2 = token tVAR ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 4
Stack now 0 4
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 4 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 4 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 28
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 72
Stack now 0 4 1 10 28 72
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 28 72 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 4 1 10 28 72 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 4 1 10 28 72 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 4 1 10 28 72 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 4 1 10 28 72 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 4 1 10 28 72 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 4 1 10 28 72 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 4 1 10 28 72 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 4 1 10 28 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 4 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 4 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 28 18 42 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 28 18 42 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 28 18 42 82 75
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 28 18 42 82 76
Next token is token ')' ()
Shifting token ')' ()
Entering state 127
Stack now 0 4 1 10 28 18 42 82 76 127
Reducing stack by rule 78 (line 171):
$1 = token '(' ()
$2 = nterm expr ()
$3 = token ')' ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 4 1 10 28 18 42 90
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 4 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 4 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 4 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 4 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 4 1 10 29 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 4 1 10 29 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 4 1 10 29 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 4 1 10 29 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 4 1 10 29 28 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 28 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 4 1 10 29 28 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 4 1 10 29 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 4 1 10 29 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 4 1 10 29 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 4 1 10 29 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 4 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 4 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 4 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 4 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 4 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 4 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 4 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 4 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 4 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 4 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 21
Stack now 0 4 21
Reducing stack by rule 1 (line 66):
$1 = nterm declarations ()
$2 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/Z-01-126-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_Z-01-126-N-ok.out Thu May 23 20:36:10 2024
----- ZONE 1 ----
*** 1 ****
! 2
--- 1 ----
! 0
output differs from expected
---------------------------Z-02-127-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 18 42 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 28 18 42 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 18 42 82 67 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 28 18 42 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 18 42 82 67 118 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 18 42 82 67 118 82 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 10 28 18 42 82 67 118 82 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204 28 49 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204 28 49 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204 28 49 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 10 28 18 42 82 67 118 82 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 10 28 18 42 82 67 118 82 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 1 10 28 18 42 82 67 118 82 76
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 18 42 82 67 118 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 18 42 82 67 118 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 1 10 28 18 42 82 67 118 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 1 10 28 18 42 82 67 118 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 28 18 42 82 67 118 162
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 28 18 42 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 10 28 18 42 90
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
3: undeclared variable 'i'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/Z-02-127-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_Z-02-127-N-ok.out Thu May 23 20:36:10 2024
----- ZONE 1 ----
*** 1 ****
- 2
--- 0 ----
output differs from expected
---------------------------Z-03-128-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 18 42 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 28 18 42 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 18 42 82 67 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 18 42 82 67 82 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 10 28 18 42 82 67 82 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 10 28 18 42 82 67 82 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204 28 49 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204 28 49 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204 28 49 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 10 28 18 42 82 67 82 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 10 28 18 42 82 67 82 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 1 10 28 18 42 82 67 82 76
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 18 42 82 67 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 18 42 82 67 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 1 10 28 18 42 82 67 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 1 10 28 18 42 82 67 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 28 18 42 82 67 118
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 18 42 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 28 18 42 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 28 18 42 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 10 28 18 42 90
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 10 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 47 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 47 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
3: undeclared variable 'i'
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: *** expected/Z-03-128-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_Z-03-128-N-ok.out Thu May 23 20:36:10 2024
----- ZONE 1 ----
*** 1 ****
- 2
--- 0 ----
output differs from expected
---------------------------Z-04-129-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 95 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 28 47 95 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 95 82 67 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 95 82 67 82 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 10 28 47 95 82 67 82 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 10 28 47 95 82 67 82 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204 28 49 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204 28 49 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204 28 49 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 10 28 47 95 82 67 82 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 10 28 47 95 82 67 82 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 1 10 28 47 95 82 67 82 76
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 95 82 67 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 95 82 67 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 1 10 28 47 95 82 67 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 1 10 28 47 95 82 67 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 28 47 95 82 67 118
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 95 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 28 47 95 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 28 47 95 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 1 10 28 47 95 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/Z-04-129-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_Z-04-129-N-ok.out Thu May 23 20:36:10 2024
----- ZONE 1 ----
*** 1 ****
- 12
--- 0 ----
output differs from expected
---------------------------Z-05-130-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 28 47 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82 67 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82 67 82 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 10 28 47 82 67 82 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 10 28 47 82 67 82 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 47 82 67 82 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 10 28 47 82 67 82 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204 28 49 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204 28 49 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204 28 49 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 10 28 47 82 67 82 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 10 28 47 82 67 82 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 1 10 28 47 82 67 82 76
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 67 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 82 67 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 1 10 28 47 82 67 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 1 10 28 47 82 67 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 28 47 82 67 118
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 28 47 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 28 47 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 28 47 95 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 141
Stack now 0 1 10 28 47 95 141
Reducing stack by rule 51 (line 142):
$1 = nterm exprs ()
$2 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 28 47 95
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 31 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 31 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 31 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 31 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 31 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 31 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 31
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/Z-05-130-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_Z-05-130-N-ok.out Thu May 23 20:36:10 2024
----- ZONE 1 ----
*** 1 ****
- 21
--- 0 ----
output differs from expected
---------------------------Z-06-131-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 72
Stack now 0 1 10 28 72
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 72 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 10 28 72 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 1 10 28 72 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 72 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 1 10 28 72 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 1 10 28 72 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 1 10 28 72 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 1 10 28 72 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 10 28 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 28 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 10 28 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 72
Stack now 0 1 10 29 28 72
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 29 28 72 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 10 29 28 72 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 1 10 29 28 72 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 29 28 72 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 1 10 29 28 72 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 1 10 29 28 72 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 1 10 29 28 72 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 1 10 29 28 72 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 10 29 28 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 29 28 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 29 28 18 42
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 18 42 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 18 42 82 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 18 42 82 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 18 42 82 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 18 42 82 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 10 29 28 18 42 82 56 107 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204 28 49 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204 28 49 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204 28 49 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 10 29 28 18 42 82 56 107 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 10 29 28 18 42 82 56 107 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 18 42 82 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 18 42 82 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 90
Stack now 0 1 10 29 28 18 42 90
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 137
Stack now 0 1 10 29 28 18 42 90 137
Reducing stack by rule 17 (line 90):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 1 10 29 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 28 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 1 10 29 28 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 1 10 29 28 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 1 10 29 28 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 1 10 29 28 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 28 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 28 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 28 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 77 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 1 10 29 77 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 1 10 29 77 79 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 77 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 1 10 29 77 79 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 1 10 29 77 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: ok (0/0). YASM: ok. LD: ld: warning: kernel.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
ok. Running: execution failed
*** expected/Z-06-131-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_Z-06-131-N-ok.out Thu May 23 20:36:10 2024
----- ZONE 1 ----
*** 1 ****
! 23
--- 1,2 ----
! 0
! 134516861
output differs from expected
---------------------------Z-07-132-N-ok.til---------------------------
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 1
Stack now 0 1
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 49("program")
Next token is token tPROGRAM ()
Shifting token tPROGRAM ()
Entering state 10
Stack now 0 1 10
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 28
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 72
Stack now 0 1 10 28 72
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 72 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 10 28 72 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 1 10 28 72 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 28 72 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 1 10 28 72 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 1 10 28 72 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 1 10 28 72 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 1 10 28 72 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 10 28 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 28 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 28 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 10 28 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 5
Stack now 0 1 10 5
Reducing stack by rule 10 (line 81):
$1 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 72
Stack now 0 1 10 29 28 72
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 29 28 72 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 39
Stack now 0 1 10 29 28 72 39
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 85
Stack now 0 1 10 29 28 72 39 85
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 29 28 72 39 85 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 133
Stack now 0 1 10 29 28 72 39 85 133
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 21 (line 98):
$1 = nterm type ()
-> $$ = nterm types ()
Entering state 132
Stack now 0 1 10 29 28 72 39 85 132
Next token is token ')' ()
Shifting token ')' ()
Entering state 174
Stack now 0 1 10 29 28 72 39 85 132 174
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 201
Stack now 0 1 10 29 28 72 39 85 132 174 201
Reducing stack by rule 20 (line 95):
$1 = token '(' ()
$2 = nterm type ()
$3 = token '(' ()
$4 = nterm types ()
$5 = token ')' ()
$6 = token ')' ()
-> $$ = nterm functionType ()
Entering state 17
Stack now 0 1 10 29 28 17
Reducing stack by rule 28 (line 107):
$1 = nterm functionType ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 29 28 18
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 29 28 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 10 29 28 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 22
Stack now 0 1 10 29 22
Reducing stack by rule 9 (line 80):
$1 = nterm declarations ()
$2 = nterm declaration ()
-> $$ = nterm declarations ()
Entering state 29
Stack now 0 1 10 29
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 34("set")
Next token is token tSET ()
Shifting token tSET ()
Entering state 56
Stack now 0 1 10 29 28 56 107 82 56
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 56 107 82 56 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 107
Stack now 0 1 10 29 28 56 107 82 56 107
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 56 107 82 56 107 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 56("function")
Next token is token tFUNCTION ()
Shifting token tFUNCTION ()
Entering state 51
Stack now 0 1 10 29 28 56 107 82 56 107 82 51
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 99
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 145
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 181
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 181
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 43("int")
Next token is token tINT_TYPE ()
Shifting token tINT_TYPE ()
Entering state 6
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 181 6
Reducing stack by rule 23 (line 102):
$1 = token tINT_TYPE ()
-> $$ = nterm type ()
Entering state 18
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 181 18
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 42
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 181 18 42
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 89
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 181 18 42 89
Reducing stack by rule 12 (line 85):
$1 = token '(' ()
$2 = nterm type ()
$3 = token tIDENTIFIER ()
$4 = token ')' ()
-> $$ = nterm declaration ()
Entering state 183
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 183
Reducing stack by rule 88 (line 187):
$1 = nterm declaration ()
-> $$ = nterm functionArg ()
Entering state 185
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 185
Reducing stack by rule 86 (line 183):
$1 = nterm functionArg ()
-> $$ = nterm functionArgs ()
Entering state 184
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 204
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 28
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204 28
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204 28 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204 28 49 82
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108("+")
Next token is token '+' ()
Shifting token '+' ()
Entering state 67
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204 28 49 82 67
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 62("i")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204 28 49 82 67 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 33
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204 28 49 82 67 33
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 118
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204 28 49 82 67 118
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204 28 49 82 67 118 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 162
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204 28 49 82 67 118 162
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 195
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204 28 49 82 67 118 162 195
Reducing stack by rule 58 (line 151):
$1 = token '(' ()
$2 = token '+' ()
$3 = nterm expr ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204 28 49 97
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204 28 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 31
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204 31
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 31 (line 114):
$1 = nterm list ()
-> $$ = nterm block ()
Entering state 207
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204 207
Next token is token ')' ()
Shifting token ')' ()
Entering state 208
Stack now 0 1 10 29 28 56 107 82 56 107 82 51 99 145 184 204 207 208
Reducing stack by rule 84 (line 179):
$1 = token '(' ()
$2 = token tFUNCTION ()
$3 = token '(' ()
$4 = nterm type ()
$5 = nterm functionArgs ()
$6 = token ')' ()
$7 = nterm block ()
$8 = token ')' ()
-> $$ = nterm function ()
Entering state 35
Stack now 0 1 10 29 28 56 107 82 56 107 35
Reducing stack by rule 83 (line 176):
$1 = nterm function ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 56 107 82 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 56 107 82 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 150
Stack now 0 1 10 29 28 56 107 150
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 186
Stack now 0 1 10 29 28 56 107 150 186
Reducing stack by rule 77 (line 170):
$1 = token '(' ()
$2 = token tSET ()
$3 = nterm lval ()
$4 = nterm expr ()
$5 = token ')' ()
-> $$ = nterm expr ()
Entering state 34
Stack now 0 1 10 29 34
Reducing stack by rule 36 (line 123):
$1 = nterm expr ()
-> $$ = nterm stmt ()
Entering state 32
Stack now 0 1 10 29 32
Reducing stack by rule 34 (line 119):
$1 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("g")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 77 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 1 10 29 77 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("1")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 1 10 29 77 79 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 77 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 1 10 29 77 79 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 1 10 29 77 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 40("println")
Next token is token tPRINTLN ()
Shifting token tPRINTLN ()
Entering state 47
Stack now 0 1 10 29 77 79 47
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 82
Stack now 0 1 10 29 77 79 47 82
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 62("f")
Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 25
Stack now 0 1 10 29 77 79 47 82 25
Reducing stack by rule 48 (line 137):
$1 = token tIDENTIFIER ()
-> $$ = nterm lval ()
Entering state 75
Stack now 0 1 10 29 77 79 47 82 75
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("2")
Next token is token tINTEGER ()
Reducing stack by rule 71 (line 164):
$1 = nterm lval ()
-> $$ = nterm expr ()
Entering state 76
Stack now 0 1 10 29 77 79 47 82 76
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 47 82 76 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 77 79 47 82 76 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 128
Stack now 0 1 10 29 77 79 47 82 76 128
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 171
Stack now 0 1 10 29 77 79 47 82 76 128 171
Reducing stack by rule 79 (line 172):
$1 = token '(' ()
$2 = nterm expr ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm expr ()
Entering state 94
Stack now 0 1 10 29 77 79 47 94
Reducing stack by rule 50 (line 141):
$1 = nterm expr ()
-> $$ = nterm exprs ()
Entering state 95
Stack now 0 1 10 29 77 79 47 95
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 142
Stack now 0 1 10 29 77 79 47 95 142
Reducing stack by rule 38 (line 125):
$1 = token '(' ()
$2 = token tPRINTLN ()
$3 = nterm exprs ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108("(")
Next token is token '(' ()
Shifting token '(' ()
Entering state 79
Stack now 0 1 10 29 77 79
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 53("return")
Next token is token tRETURN ()
Shifting token tRETURN ()
Entering state 49
Stack now 0 1 10 29 77 79 49
Reading a token
--(end of buffer or a NUL)
--accepting rule at line 110(" ")
--(end of buffer or a NUL)
--accepting rule at line 86("0")
Next token is token tINTEGER ()
Shifting token tINTEGER ()
Entering state 23
Stack now 0 1 10 29 77 79 49 23
Reducing stack by rule 52 (line 145):
$1 = token tINTEGER ()
-> $$ = nterm expr ()
Entering state 97
Stack now 0 1 10 29 77 79 49 97
Reading a token
--accepting rule at line 108(")")
Next token is token ')' ()
Shifting token ')' ()
Entering state 143
Stack now 0 1 10 29 77 79 49 97 143
Reducing stack by rule 46 (line 133):
$1 = token '(' ()
$2 = token tRETURN ()
$3 = nterm expr ()
$4 = token ')' ()
-> $$ = nterm stmt ()
Entering state 80
Stack now 0 1 10 29 77 80
Reducing stack by rule 35 (line 120):
$1 = nterm list ()
$2 = nterm stmt ()
-> $$ = nterm list ()
Entering state 77
Stack now 0 1 10 29 77
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--accepting rule at line 108(")")
Next token is token ')' ()
Reducing stack by rule 30 (line 113):
$1 = nterm declarations ()
$2 = nterm list ()
-> $$ = nterm block ()
Entering state 30
Stack now 0 1 10 30
Next token is token ')' ()
Shifting token ')' ()
Entering state 78
Stack now 0 1 10 30 78
Reducing stack by rule 5 (line 72):
$1 = token '(' ()
$2 = token tPROGRAM ()
$3 = nterm block ()
$4 = token ')' ()
-> $$ = nterm main-program ()
Entering state 3
Stack now 0 3
Reducing stack by rule 2 (line 67):
$1 = nterm main-program ()
-> $$ = nterm file ()
Entering state 2
Stack now 0 2
Reading a token
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--(end of buffer or a NUL)
--accepting rule at line 110("
")
--(end of buffer or a NUL)
--EOF (start condition 0)
Now at end of input.
Shifting token "end of file" ()
Entering state 20
Stack now 0 2 20
Stack now 0 2 20
Cleanup: popping token "end of file" ()
Cleanup: popping nterm file ()
Compiler: failed (139/0). YASM: ok. LD: ok. Running: execution failed
*** expected/Z-07-132-N-ok.out Thu May 23 20:23:44 2024
--- logs/105_Z-07-132-N-ok.out Thu May 23 20:36:10 2024
----- ZONE 1 ----
*** 1 ****
- 23
--- 0 ----
output differs from expected